6

IP アドレスからホスト名を解決しようとしています。gethostbyaddr()andを使用してみgetnameinfo()ましたが、多くの場合、ホスト名はまったく解決されません。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";
}
4

2 に答える 2

6

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

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


getnameinfo()に対しての結果を確認し、EAI_AGAIN等しい場合はリクエストを再試行します。


また、受信EAI_OVERFLOWしても応答がないわけではありません。とにかく、結果を配置するために259文字を提供すると、ほとんどの場合、EAI_OVERFLOW... ;-)が得られません


ところで:excanoeは、 and ...に固執するという彼のコメントで正しいです- そして、どういうわけか非推奨です。また、それらの結果の処理は複雑で、プログラミング エラーを引き起こす傾向があります。getaddrinfo()getnameinfo()gethostbyaddr()gethostbyname()

于 2012-05-12T14:47:40.793 に答える
5

私は Windows を使用しているので、申し訳ありません (*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

お役に立てれば。

于 2012-05-12T14:53:59.823 に答える