2012-05-12 119 views
5

我正在嘗試從ip地址解析主機名。我曾嘗試使用gethostbyaddr()getnameinfo(),但在許多情況下,主機名根本沒有解析。有沒有更好的方法將IP地址變成有效的主機名?將ip解析爲主機名

char* ip = argv[1]; 
// using gethostbyaddr() 
hostent * phe = gethostbyaddr(ip, strlen(ip), AF_INET); 
if(phe) { 
    cout << phe->h_name << "\n"; 
} 

// using getnameinfo() 
char hostname[260]; 
char service[260]; 
sockaddr_in address; 
memset(&address, 0, sizeof(address)); 
address.sin_family = AF_INET; 
address.sin_addr.s_addr = inet_addr(ip); 
int response = getnameinfo((sockaddr*)&address, 
          sizeof(address), 
          hostname, 
          260, 
          service, 
          260, 
          0); 
if(response == 0) { 
    cout << hostname << "\n"; 
} 
+3

並非所有IP地址都有反向主機名。是什麼讓你認爲不返回主機名的IP地址應該有一個? – Bruno

+1

@Bruno - 在某些情況下,當我沒有獲得主機名時,我嘗試從終端運行'nslookup

',並且該命令確實返回了一個主機名。所以我在想,也許有更準確的方式來做這種事情。 – Cyclonecode

+2

我知道這不是一個答案,但你應該堅持使用getaddrinfo和getnameinfo,因爲它們在Ipv4和Ipv6網絡地址的這兩種情況下都很有用。 – excanoe

回答

5

我一直在使用gethostbyaddr()getnameinfo()試圖[...]。有沒有更好的方法將IP地址變成有效的主機名?

不,getnameinfo()是選擇的方法。


你可能要檢查的getnameinfo()結果對EAI_AGAIN,相等重試請求。


還收到EAI_OVERFLOW並不意味着你沒有迴應。總之,你提供259個字符結果放在你最有可能不會得到一個EAI_OVERFLOW ... ;-)


BTW:excanoe是正確與his commentgetaddrinfo()getnameinfo()堅持... - gethostbyaddr()gethostbyname()不知何故被棄用。處理它們的結果也很複雜,並且往往會引發編程錯誤。

4

我使用Windows非常抱歉(你可以跳過WSADATA部分,如果你使用* nix中)有關此版本:)

#include <stdio.h> 
    #include <stdlib.h> 
    #include <stdint.h> 

    #include <winsock2.h> 

    int main(){ 
    struct addrinfo hints; 
    struct addrinfo *res=0; 
    int  status; 

    WSADATA wsadata; 
    int statuswsadata; 
    if((statuswsadata=WSAStartup(MAKEWORD(2,2),&wsadata))!=0){ 
     printf("WSAStartup failed: %d\n",statuswsadata); 
    } 

    hints.ai_family =AF_INET; 

    status=getaddrinfo("87.250.251.11",0,0,&res); 

    { 
     char host[512],port[128]; 

     status=getnameinfo(res->ai_addr,res->ai_addrlen,host,512,0,0,0); 

     printf("Host: %s",host); 

     freeaddrinfo(res); 
    } 
    } 

我得到這個:

d:\temp\stack>ip 
Host: yandex.ru 

87.250.251.11這是一個網絡地址yandex.ru:

C:\Users\user>ping yandex.ru 

Pinging yandex.ru [87.250.251.11] with 32 bytes of data: 
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56 
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56 
Reply from 87.250.251.11: bytes=32 time=21ms TTL=56 

Ping statistics for 87.250.251.11: 
    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 21ms, Maximum = 21ms, Average = 21ms 

Hope thi s幫助。