ai_family的有效值是多少?

时间:2012-02-17 05:45:25

标签: c++ sockets network-programming

以下是我为接受来自客户端的连接而编写的代码片段。我想打印远程主机名。 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 个答案:

答案 0 :(得分:1)

您的错误较早。 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);

...然后编写其余代码。