2010-10-08 46 views
0

是否有可能解密給定sockaddr_in結構的主機名?POSIX插座;從sockaddr_in結構解密主機名

struct sockaddr_in { 
    short   sin_family; // e.g. AF_INET, AF_INET6 
    unsigned short sin_port;  // e.g. htons(3490) 
    struct in_addr sin_addr;  // see struct in_addr, below 
    char    sin_zero[8]; // zero this if you want to 
}; 

struct in_addr { 
    unsigned long s_addr;   // load with inet_pton() 
}; 

我已經嘗試打印出「udp_server.sin_addr.s_addr」(其中udp_server是類型爲struct sockaddr_in的)和它印刷我的數。

我相信s_addr變量轉換爲網絡長嗎?如何將其轉換爲可讀格式,以便我可以確定主機?

回答

2

有許多功能可將您提到的數字(長格式的網絡地址)轉換爲可讀地址。

看看inet_pton()inet_ntop()(演示數字,演示數字)。這些都是AF_INET特定的,如果我沒有弄錯的話,它們都適用於IPv4和IPv6。

Suerte!

+1

但請注意,這會產生人類可讀的* IP地址*,而不是*主機名*。要恢復*主機名*,如果您擁有的只是一個套接字地址,則必須執行反向DNS查找(例如,使用'getnameinfo'),這不能保證給您提供任何有用的信息。 (這就是爲什麼,例如,HTTP/1.1要求客戶端告訴服務器它認爲它正在與應用層數據通話的主機名。) – zwol 2015-05-28 16:53:54