0

如果我需要获取 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);
4

2 回答 2

3

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

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

于 2013-02-07T19:38:35.457 回答
1

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

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

调用者可以通过提供 NULL host(或 serv)参数或零 hostlen(或 servlen)参数来指定不需要主机名(或不需要服务名)。但是,必须至少请求主机名或服务名之一。

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

关于这个问题的来源,我会听从其他人的意见,但如果你好奇的话,代码就在 glibc 中。

于 2013-02-07T19:53:48.630 回答