sockaddr_in中的sin_port

时间:2013-02-07 19:31:41

标签: c++ c linux posix

如果需要获取IP的主机名,我应该使用哪个端口? getnameinfo()从哪里获取主机名?

struct sockaddr_in sa;
sa.sin_family    = AF_INET;
sa.sin_port    = htons(?); // which port ?
inet_pton(AF_INET, "x.x.x.x", &(sa.sin_addr));

char host[NI_MAXHOST];
getnameinfo((struct sockaddr *)&sa, sizeof(sa), host, NI_MAXHOST, NULL, 0, NI_NAMEREQD);

puts(host);

2 个答案:

答案 0 :(得分:3)

如果您不使用servservlen参数,则端口号无关紧要。否则,它用于通过端口号查找服务,类似于端口22的"ssh",端口25的"smtp"等等(请参阅/etc/services更多)。

getnameinfo()可以从多个位置获取主机名(使用nsswitch.conf,可以为不同类型的名称解析启用其他libnss模块。在典型的桌面Linux发行版上,我希望它首先查看/etc/hosts,然后根据/etc/resolv.conf查询DNS服务器。

答案 1 :(得分:1)

来自http://www.kernel.org/doc/man-pages/online/pages/man3/getnameinfo.3.html

  

sa参数是指向通用套接字地址结构的指针(类型为   sockaddr_in或sockaddr_in6)大小salen,其中包含输入的IP地址和   端口号。参数host和serv是调用者分配的指针   缓冲区(大小分别为hostlen和servlen)getnameinfo()   放置包含主机和服务名称的以null结尾的字符串   分别

     

调用者可以指定不需要主机名(或没有服务名称)   提供NULL主机(或serv)参数或零hostlen(或servlen)   论点。但是,必须至少有一个主机名或服务名   请求。

因此,如果您只对主机名感兴趣,请不要为服务名称提供缓冲区。

我会推荐其他人关于这个问题的来源,但如果你很好奇,那么代码就是glibc。