gethostbyname en C

3 minutos de lectura

Avatar de usuario de Matic
matic

No sé cómo escribir aplicaciones en C, pero necesito un pequeño programa que haga:

lh = gethostbyname("localhost");
output = lh->h_name;

se va a imprimir la variable de salida.

El código anterior se usa en el controlador de base de datos PHP MongoDB para obtener el nombre de host de la computadora (el nombre de host es parte de una entrada para generar una ID única). Soy escéptico de que esto devuelva el nombre de host, por lo que me gustaría alguna prueba.

Cualquier ejemplo de código sería de gran ayuda.

Día feliz.

avatar de usuario de caf
coste y flete

#include <stdio.h>
#include <netdb.h>


int main(int argc, char *argv[])
{
    struct hostent *lh = gethostbyname("localhost");

    if (lh)
        puts(lh->h_name);
    else
        herror("gethostbyname");

    return 0;
}

No es una forma muy confiable de determinar el nombre de host, aunque a veces puede funcionar. (lo que devuelve depende de cómo /etc/hosts está arreglado). Si tienes una línea como:

127.0.0.1    foobar    localhost

…entonces devolverá “foobar”. Sin embargo, si lo tiene al revés, lo cual también es común, simplemente devolverá “localhost”. Una forma más confiable es usar el gethostname() función:

#include <stdio.h>
#include <unistd.h>
#include <limits.h>

int main(int argc, char *argv[])
{
    char hostname[HOST_NAME_MAX + 1];

    hostname[HOST_NAME_MAX] = 0;
    if (gethostname(hostname, HOST_NAME_MAX) == 0)
        puts(hostname);
    else
        perror("gethostname");

    return 0;
}

  • deberías pasar sizeof(hostname) -1 como longitud a gethostname(). De lo contrario, podría terminar sin terminación nula si se produce un truncamiento. Según mi página de manual: “POSIX.1 dice que si se produce tal truncamiento, entonces no se especifica si el búfer devuelto incluye un byte nulo de terminación”.

    – scai

    24 de enero de 2017 a las 12:08

  • @scai: Gracias, arreglado.

    – café

    24 de enero de 2017 a las 13:40

avatar de usuario de paxdiablo
paxdiablo

En C/UNIX, el equivalente sería algo como:

#include <stdio.h>
#include <netdb.h>

int main (int argc, char *argv[]) {
    struct hostent *hstnm;
    if (argc != 2) {
        fprintf(stderr, "usage: %s hostname\n", argv[0]);
        return 1;
    }
    hstnm = gethostbyname (argv[1]);
    if (!hstnm)
        return 1;
    printf ("Name: %s\n", hstnm->h_name);
    return 0;
}

y la prueba de que funciona:

$ hstnm localhost
Name: demon-a21pht

Pero pruébalo tú mismo. Siempre que tenga el entorno correcto, debería estar bien.

¿lo que está mal?

h_nombre

El nombre oficial del host (PC). Si utiliza el DNS o un sistema de resolución similar, es el nombre de dominio completo (FQDN) el que hizo que el servidor devolviera una respuesta. Si usa un archivo de host local, es la primera entrada después de la dirección IPv4.

  • Y, por supuesto, el DNS no se utilizará para “localhost”, por lo que es el archivo de hosts locales el que es relevante. Si la entrada en el archivo de hosts locales tiene tanto “localhost” como el nombre de host real asociado con la misma dirección (127.0.0.1) y el nombre de host real es la primera entrada, luego h_name devolverá el nombre de host real.

    – David Gelhar

    19 de mayo de 2010 a las 13:02


  • @David Gelhar: localhost no es un nombre de computadora. localhost se resuelve en 127.0.0.1 pero no hay conversión hacia atrás. en.wikipedia.org/wiki/Localhost

    – Andrei

    19 mayo 2010 a las 13:33

  • correcto, pero el punto es que si /etc/hosts parece 127.0.0.1 realname.com localhost después gethostbyname("localhost") devolverá “realname.com” en h_name, pero si se invierte el orden, devolverá “localhost” (consulte la respuesta de caf).

    – David Gelhar

    19 de mayo de 2010 a las 14:06

¿Ha sido útil esta solución?