Каковы допустимые значения для ai_family? - PullRequest
2 голосов
/ 17 февраля 2012

Ниже приведен фрагмент кода, который я написал для приема соединений от клиента.Я хотел напечатать имя удаленного хоста.getnameinfo () завершается с ошибкой: ai_family не поддерживается.Я пробовал различные варианты через Интернет, такие как указание AF_UNSPEC.Ничто не работает для меня.Я напечатал поле sa_family, и оно 62752. Это допустимое значение?Что я делаю неправильно.Любая помощь приветствуется.

socklen_t sin_size;
struct sockaddr client_addr;
int sockfd = accept(serv_sockfd,&client_addr, &sin_size);
if(sockfd == -1)
   error("Accept failed");

char remote_host[NI_MAXHOST];
cerr <<"sa_family" << client_addr.sa_family<<endl;

int en;
if ((en = getnameinfo(&client_addr, sin_size, remote_host, sizeof(remote_host),NULL, 0, NI_NAMEREQD))!=0)
cerr << "getnameinfo: " << gai_strerror(en);
else
   printf("host=%s\n", remote_host);

1 Ответ

1 голос
/ 17 февраля 2012

Ваша ошибка ранее.Третий аргумент accept () должен быть:

address_len

Указывает на структуру socklen_t, которая на входе указывает длину предоставленной структуры sockaddr, а при выводе указывает длину сохраненного адреса.

Кроме того, struct sockaddr слишком мал, чтобы содержать какой-либо фактический адрес.

Попробуйте:

struct sockaddr_storage client_addr;
socklen_t sin_size = sizeof(client_addr);
int sockfd = accept(serv_sockfd, (struct sockaddr *)&client_addr, &sin_size);

... а затем весь остальной код, как написано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...