2013-02-07 16 views
0

如果我需要獲取IP的主機名,我應該使用哪個端口? getnameinfo()從哪裏獲取主機名?sin_port in sockaddr_in

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); 

回答

3

如果你不使用servservlen參數,端口號是無關緊要的。否則,它用於通過端口號查找服務,例如端口22的"ssh",端口25的"smtp"等(有關更多信息,請參閱/etc/services)。

getnameinfo()可以從多個位置獲得主機名(使用nsswitch.conf,可以爲其他libnss模塊啓用不同類型的名稱解析)。在典型的桌面Linux發行版上,我期望它首先查看/etc/hosts,然後根據/etc/resolv.conf查詢DNS服務器。

1

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

的SA參數是一個指向到一個通用的套接字地址結構( 型SOCKADDR_IN的或sockaddr_in6的)大小沙崙包含輸入IP地址和 端口號。參數host和serv是指向調用者分配的 緩衝區(分別爲hostlen和servlen的大小)的指針,其中getnameinfo() 分別放置包含主機和服務名稱的空終止字符串 。

調用者可以指定 提供NULL主機(或serv)參數或零hostlen(或servlen) 參數所需的主機名(或無服務名稱)。但是,主機名或服務名稱中的至少一個必須是 請求的。

因此,如果您只對主機名感興趣,請不要爲服務名稱提供緩衝區。

我會根據主題來自其他人,但如果您好奇的話,代碼是在glibc中。