2012-05-12 17 views
5

Estoy tratando de resolver un nombre de host desde una dirección IP. He intentado usar gethostbyaddr() y getnameinfo() pero en muchos casos el nombre de host no se resuelve en absoluto. ¿Hay una mejor manera de convertir una dirección IP en un nombre de host válido?Resolver ip al nombre de host

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

No todas las direcciones IP tienen un nombre de host inverso. ¿Qué te hace pensar que las direcciones IP que no devuelven un nombre de host deberían tener una? – Bruno

+1

@Bruno - En algunos casos, cuando no obtengo un nombre de host, he intentado ejecutar 'nslookup

' desde el terminal y el comando devuelve un nombre de host. Entonces pensé que tal vez haya una forma más precisa de hacer este tipo de cosas. – Cyclonecode

+2

Sé que esto no es una respuesta PERO debe seguir con getaddrinfo y getnameinfo porque son útiles en ambos casos para las direcciones de red Ipv4 e Ipv6. – excanoe

Respuesta

5

He intentado usar gethostbyaddr() y getnameinfo() [...]. ¿Hay una mejor manera de convertir una dirección IP en un nombre de host válido?

No, getnameinfo() es el método de elección.


Usted puede comprobar el resultado de getnameinfo() contra EAI_AGAIN, y si es igual de reintento de la solicitud.


También recibieron EAI_OVERFLOW no quiere decir que no obtuvo respuesta. De todos modos y cuando proporcione 259 caracteres para colocar el resultado en que en su mayoría probablemente no obtener una EAI_OVERFLOW ... ;-)


Por cierto: excanoe está bien en his comment en la pervivencia de getaddrinfo() y getnameinfo() ... - gethostbyaddr() y gethostbyname() son de alguna manera obsoletos. También el manejo de su (s) resultado (s) es complicado y tiende a provocar errores de programación.

4

Estoy utilizando Windows lo siento (se puede omitir la sección WSADATA si está utilizando * nix) acerca de esta versión :)

#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); 
    } 
    } 

me sale esto:

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

87.250.251.11 es una dirección de red de host 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 ayuda.

Cuestiones relacionadas