如果需要获取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);
答案 0 :(得分:3)
如果您不使用serv
和servlen
参数,则端口号无关紧要。否则,它用于通过端口号查找服务,类似于端口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。