получение ip и порта из хранилища sockaddr

у меня есть sockaddr_storage содержит IPv4-адрес и порт удаленного хоста. Я их не видел!--1-->перед хотя и я не уверен, как бросить его в struct где я могу напрямую получить IP-адрес и номер порта. Я пробовал гуглить struct но ничего не нашли. Есть предложения, как это сделать?

спасибо

2 ответов


вы можете бросить указатель на struct sockaddr_in * или struct sockaddr_in6 * и получить доступ к членам напрямую, но это откроет банку червей о сглаживании нарушений и проблемах с неправильной компиляцией.

лучшим подходом было бы передать указатель на getnameinfo С NI_NUMERICHOST и NI_NUMERICSERV флаги для получения строкового представления адреса и порта. Это имеет то преимущество,что он поддерживает как IPv4, так и IPv6 без дополнительного кода, и теоретически поддерживает все будущие типы адресов. Вы возможно, придется бросить указатель на void * (или struct sockaddr * явно, если вы используете C++), чтобы передать его в getnameinfo, но это не должно вызвать проблем.


чтобы расширить ответ выше и предоставить код, который использует getnameinfo функция, проверьте этот фрагмент:

struct sockaddr_storage client_addr;
socklen_t client_len = sizeof(struct sockaddr_storage);

// Accept client request
int client_socket = accept(server_socket, (struct sockaddr *)&client_addr, &client_len);

char hoststr[NI_MAXHOST];
char portstr[NI_MAXSERV];

int rc = getnameinfo((struct sockaddr *)&client_addr, client_len, hoststr, sizeof(hoststr), portstr, sizeof(portstr), NI_NUMERICHOST | NI_NUMERICSERV);
if (rc == 0) printf("New connection from %s %s", hoststr, portstr);

в результате получается, что a hoststr содержит IP-адрес от struct sockaddr_storage и a portstr содержит порт соответственно.