gethostbyname()
-
Hola,
Tengo el siguiente código (eliminando partes innecesarias):El problema que tengo es que las direcciones en hp->h_addr_list[] no se muestran correctamente. En la documentación del API pone que h_addr_list contiene las direcciones en 'netword byte order'. ¿Cómo puedo mostrarlo correctamente?Código:char host_name[64]; hostent* hp = gethostbyname(host_name); if (hp == NULL) printf_s("cannot resolve host name\n"); else { printf_s("official name of the host: %s\n", hp->h_name); for (int i = 0; hp->h_addr_list[i] != NULL; ++i) printf_s("address %u of host: %s\n", i+1, hp->h_addr_list[i]); }
Gracias! - Por ejemplo, al intentar resolver www.google.es, me sale:Código:
struct hostent { char FAR * h_name; /* official name of host */ char FAR * FAR * h_aliases; /* alias list */ short h_addrtype; /* host address type */ short h_length; /* length of address */ char FAR * FAR * h_addr_list; /* list of addresses */ #define h_addr h_addr_list[0] /* address, for backward compat */ };Código:host name: www.google.es official name of the host: www.l.google.com address 1 of host: B¨]hB¨]ôB¨]cwww.google.es address 2 of host: B¨]ôB¨]cwww.google.es address 3 of host: B¨]cwww.google.es Presione una tecla para continuar . . .
-
Y cómo hago para mostrar el resto de la información (nombre de dominio)?
Tengo el siguiente código:El problema es que no me muestra bien las direcciones. Espero que alguien me pueda ayudar.Código:int main() { char host_name[64]; hostent* hp; WSADATA wsadata; if (WSAStartup(MAKEWORD(1, 0), &wsadata) != 0) { printf_s("cannot start sockets dll"); return 1; } printf_s("host name: "); fgets2(host_name, 64, stdin); unsigned long addr = inet_addr(host_name); if (addr != INADDR_NONE) hp = gethostbyaddr((char*)&addr, 4, AF_INET); else hp = gethostbyname(host_name); if (hp == NULL) printf_s("cannot resolve host name\n"); else { printf_s("official name of the host: %s\n", hp->h_name); for (int i = 0; hp->h_addr_list[i] != NULL; ++i) printf_s("address %u: %d %d %d %d (%s)\n", i+1, hp->h_addr_list[i][0], hp->h_addr_list[i][1], hp->h_addr_list[i][2], hp->h_addr_list[i][3], hp->h_addr_list + i * hp->h_length + 4); } WSACleanup(); system("pause"); return 0; } -
Hola,
así como esta no compilaba nada porque no tenía los headers ni la librería con la que había que enlazar, además si es C puro tenés que declarar todas las variables al principio del documento. Y otra cosa, utilizá las funciones estándar tipo printf, por qué printf_s? si la otra es estándar :P También tenés que saber que hostent es un struct y no un typedef, por ende no se va a declarar sin la palabra clave struct, a menos que estés programando en C++, donde un struct es equivalente a una case y por ende a un tipo definido por el usuario :P Ah, dicho sea de paso te agregué otra forma de comprobar si es una dirección IP o un nombre, no porque la tuya esté mal ni nada, simplemente para que veas otra forma, utilizá la que más te guste (o alguna otra, hay mil y una formas de hacer las mismas cosas :P)
Bueno, acá tenés el programa:Saludos.Código PHP:// Incluimos los encabezados
#include int main()
#include
#include
// Linkeamos contra la librería adecuada
#pragma comment(lib, "Ws2_32.lib")
{
// Declaramos las variables al principio, como C manda :P
char host_name[64];
struct hostent* hp; // Declaramos con la palabra clave struct !!!
unsigned long addr;
int i;
WSADATA wsadata;
if (WSAStartup(MAKEWORD(1, 0), &wsadata) != 0)
{
printf("cannot start sockets dll");
return 1;
}
// Utilizo printf y fgets (y no printf_S y fgets3 O.o)
printf("host name: ");
fgets(host_name, 64, stdin);
host_name [ strlen ( host_name ) - 1 ] = 0; // Quitamos el '\n' obtenido por fgets.
//addr = inet_addr(host_name);
//if (addr != INADDR_NONE)
// hp = gethostbyaddr((char*)&addr, 4, AF_INET);
//else
if ( isdigit ( host_name [ 0 ] ) )
{
addr = inet_addr(host_name);
hp = gethostbyaddr((char*)&addr, 4, AF_INET);
}
else
hp = gethostbyname(host_name);
if (hp == NULL)
printf("cannot resolve host name\n");
else
{
printf("official name of the host: %s\n", hp->h_name);
for (i = 0; hp->h_addr_list[i] != NULL; ++i)
printf("address %d: %s\n", i+1, inet_ntoa ( *( struct in_addr * ) hp->h_addr_list [ i ] ) );
}
WSACleanup();
//system("pause");
return 0;
}
PD: Qué nombre de dominio querés imprimir? O.o es decir, el dominio puede ser tanto .com como psicofxp.com, depende que dominio quieras O.o
PD2: Asumí que estás en Visual Studio, sino quitá ese pragma y linkea adecuadamente :P -
Gracias por el código, lo estoy mirando. Por cierto, estaba usando C++. Tienes razón en cuanto a lo de usar printf_s, pero fgets2 era un función mía que hacía lo mismo que fgets pero quitaba el salto de línea.
La forma que usas para comprobar si es una dirección IP o un nombre tiene una pega: ¿qué pasa si el nombre empieza por un dígito? Lo interpreta como dirección IP.
