получение 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 содержит порт соответственно.