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