2012-05-12 15 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アドレスには、1つのIPアドレスが必要だと思いますか? – Bruno

+1

@Bruno - ホスト名が得られない場合がありますが、ターミナルから 'nslookup

'を実行しようとしましたが、コマンドはホスト名を返します。だから私はおそらく、このようなことをするより正確な方法があると考えていました。 – Cyclonecode

+2

これは答えではありませんが、getaddrinfoとgetnameinfoはIpv4とIpv6の両方のネットワークアドレスの両方の場合に便利なので、固執すべきです。 – excanoe

答えて

5

私は[...] gethostbyaddr()getnameinfo()を使用して試してみました。 IPアドレスを有効なホスト名にするより良い方法はありますか?

いいえ、getnameinfo()が選択方法です。


あなたはEAI_AGAINに対してgetnameinfo()の結果を確認し、同じ要求を再試行する場合があります。


また、EAI_OVERFLOWを受け取っても、応答が得られないわけではありません。とにかく、あなたはほとんどそうところでEAI_OVERFLOW ... ;-)


を取得することはありませんで、結果を配置するために259個の文字を提供して:excanoeは... getaddrinfo()getnameinfo()にこだわっ上his commentと権利である - gethostbyaddr()gethostbyname()は何とか廃止されました。また、その結果を扱うことは複雑であり、プログラミングエラーを引き起こす傾向があります。

4

私はこのバージョンについて(あなたは* nixのを使用している場合は、WSADATAセクションをスキップすることができます)ので、申し訳ありません:)

#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 

ホープティ助けてください。

関連する問題