получение ip и порта из sockaddr_storage - PullRequest
7 голосов
/ 07 сентября 2011

У меня есть sockaddr_storage, содержащий адрес ipv4 и порт удаленного хоста.Я не видел эти struct раньше, и я не уверен, как преобразовать его в struct, где я могу напрямую получить IP-адрес и номер порта.Я пытался погуглить на struct, но ничего не нашел.Любые предложения о том, как это сделать?

Спасибо

Ответы [ 2 ]

5 голосов
/ 07 сентября 2011

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

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

2 голосов
/ 02 октября 2016

Чтобы расширить ответ выше и предоставить код, который использует функцию 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);

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

...