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.
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 agethostname()
. 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
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ésgethostbyname("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