2010-05-19 18 views
11

no sé cómo escribir aplicaciones en C, pero necesito un pequeño programa que hace:Gethostbyname en C

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

variable de salida se va a imprimir.

El código anterior se utiliza 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, así que me gustaría tener alguna prueba.

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

Feliz día,

Matic

Respuesta

19
#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 esté configurado /etc/hosts). Si tiene una línea como:

127.0.0.1 foobar localhost 

... entonces devolverá "foobar". Sin embargo, si lo haces al revés, que también es común, entonces simplemente devolverá "localhost". Una forma más fiable es utilizar la función gethostname():

#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; 
} 
+0

Debe pasar 'sizeof (nombre de host) -1' como longitud a' gethostname() '. De lo contrario, podría terminar sin terminación nula si se produce el truncamiento. De acuerdo con mi página de manual: "POSIX.1 dice que si ocurre tal truncamiento, entonces no se especifica si el buffer devuelto incluye un byte nulo de terminación. " – scai

+0

@scai: Gracias, corregido. – caf

2

lo que está mal?

h_name

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

+0

Y, por supuesto DNS no va a ser utilizado para "localhost", por lo que es el archivo de hosts locales que es relevante. * Si * la entrada en el archivo de hosts local 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, entonces h_name devolverá el nombre de host real. –

+0

@David Gelhar: localhost no es un nombre de computadora. localhost resuelve a 127.0.0.1 pero no hay conversión inversa. http://en.wikipedia.org/wiki/Localhost – Andrey

+0

a la derecha, pero el punto es que si/etc/hosts se ve como '127.0.0.1 realname.com localhost', entonces' gethostbyname ("localhost") 'devolverá el nombre real .com "en h_name, pero si la orden se invierte, devolverá" localhost "(vea la respuesta de caf). –

5

En C/UNIX, el equivalente sería algo así 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 hacerlo por uno mismo. Siempre que tenga el entorno correcto, debería estar bien.