getsockname
всегда, кажется, заполняет storage
структурой, семейство которой установлено в ноль, что означает, что протокол не указан.
void print_address_attached_to_socket(int socket) {
socklen_t socket_length;
struct sockaddr_storage storage;
int returncode = getsockname(socket, (struct sockaddr *) (&storage), &socket_length);
if (returncode != 0) {
perror("Errror getting sock name");
exit(1);
}
if (storage.ss_family == 0) {
std::cout << "Family is unspecified getsockname failed without telling why..." << std::endl;
return;
} else {
struct sockaddr *sock_addr = (struct sockaddr *) &storage;
char host[128] = {0}, serv[128] = {0};
returncode = getnameinfo(sock_addr, socket_length, host, 128, serv, 128, NI_NUMERICHOST | NI_NUMERICSERV);
if (returncode != 0) {
printf("Errror getting resolving name");
exit(1);
}
std::cout << "Host: " << host << ":" << std::endl;
}
}
Эта функция вызывается после подключения и перед закрытием.
Пример использования: https://gist.github.com/Hajto/09058b335b2466033f96a9a1adfebef4 client.cpp: код, вызывающий вышеуказанный фрагмент, который должен получить информацию о хосте, подключенном к сокету server.cpp: поскольку код используется, код используется на клиенте. Я также подключил сервервключить запуск клиента.