簡體   English   中英

sockaddr_in中的sin_port

[英]sin_port in sockaddr_in

如果需要獲取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);

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

getnameinfo()可以從多個位置獲取主機名(使用nsswitch.conf ,可以為各種名稱解析啟用其他libnss模塊)。 在一個典型的台式機Linux發行版上,我希望它首先查看/etc/hosts ,然后根據/etc/resolv.conf查詢DNS服務器。

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

sa參數是指向大小為salen的通用套接字地址結構(類型為sockaddr_in或sockaddr_in6)的指針,該結構保存輸入的IP地址和端口號。 參數host和serv是指向調用者分配的緩沖區(大小分別為hostlen和servlen)的指針,getnameinfo()將包含主機名和服務名的以空終止的字符串分別放入其中。

調用方可以通過提供NULL主機(或serv)參數或零hostlen(或servlen)參數來指定不需要主機名(或服務名)。 但是,必須至少請求主機名或服務名之一。

因此,如果您僅對主機名感興趣,請不要為服務名提供緩沖區。

我會就這個問題的來源向其他人介紹,但是如果您好奇的話,代碼位於glibc中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM