12 Último

gethostbyname()

      • 10
      • mensajes
      • miembro desde
      • 02/05/07
    07/08/2007
    #1 gethostbyname()

    Hola,

    Tengo el siguiente código (eliminando partes innecesarias):

    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]);
    }
    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?

    Gracias!
  1. ¿Este tema te pareció interesante? Compártelo!

    ¿No es lo que buscabas? Intenta buscar un tema similar

    10 comentarios / 13765 Visitas

      • 685
      • mensajes
      • miembro desde
      • 13/06/04
    08/08/2007
    #2 Re: gethostbyname()

    como te estan saliendo las direcciones? yo crei qeu estaba encapsulado el tratamiento de direcciones...

    pone como salen

      • 2,582
      • mensajes
      • miembro desde
      • 16/03/04
    08/08/2007
    #3 Re: gethostbyname()

    Para que quede mas claro, deberias mostrar la definicion de la estructura "hostent". Asi te podemos decir si estas haciendo bien las cosas.

      • 10
      • mensajes
      • miembro desde
      • 02/05/07
    08/08/2007
    #4 Re: gethostbyname()
    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 */
    };
    Por ejemplo, al intentar resolver www.google.es, me sale:

    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 . . .
      • 5,455
      • mensajes
      • miembro desde
      • 01/01/07
    • Baneado/a
    • Baneado
    08/08/2007
    #5 Re: gethostbyname()

    En h_addr_list tenes 4 bytes en donde cada uno es un segmento de la direccion ip asi que para mostrarlo lo debes acceder como entero a cada uno de los elementos: h_addr_list[0][0] ... h_addr_list[0][3] .

      • 2,582
      • mensajes
      • miembro desde
      • 16/03/04
    08/08/2007
    #6 Re: gethostbyname()

    claro, entonces lo que sucede es que lo que queres mostrar no es texto "%s" sino bytes, proba con hacer el printf con "%c" o "%d"

      • 5,455
      • mensajes
      • miembro desde
      • 01/01/07
    • Baneado/a
    • Baneado
    08/08/2007
    #7 Re: gethostbyname()

    Con %d

      • 10
      • mensajes
      • miembro desde
      • 02/05/07
    08/08/2007
    #8 Re: gethostbyname()

    Y cómo hago para mostrar el resto de la información (nombre de dominio)?

    Tengo el siguiente código:

    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;
    }
    El problema es que no me muestra bien las direcciones. Espero que alguien me pueda ayudar.
      • 2,110
      • mensajes
      • miembro desde
      • 22/01/05
    09/08/2007
    #9 Re: gethostbyname()

    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:

    Código PHP:
    // Incluimos los encabezados
    #include 
    #include 
    #include 
    // Linkeamos contra la librería adecuada
    #pragma comment(lib, "Ws2_32.lib")
    int main()
    {
    // Declaramos las variables al principio, como C manda :P
    char host_name[64];
    struct hostenthp// Declaramos con la palabra clave struct !!!
    unsigned long addr;
    int i;
    WSADATA wsadata;
    if (
    WSAStartup(MAKEWORD(10), &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_name64stdin);
    host_name strlen host_name ) - ] = 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 ] ) )
    {
     
    addr inet_addr(host_name); 
     
    hp gethostbyaddr((char*)&addr4AF_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 (
    0hp->h_addr_list[i] != NULL; ++i)
      
    printf("address %d: %s\n"i+1inet_ntoa ( *( struct in_addr * ) hp->h_addr_list ] ) );
    }
    WSACleanup();
    //system("pause");
    return 0;

    Saludos.

    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
      • 10
      • mensajes
      • miembro desde
      • 02/05/07
    10/08/2007
    #10 Re: gethostbyname()

    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.

12 Último