2010-05-19 9 views
11

non so come scrivere applicazioni in C, ma ho bisogno di un piccolo programma che fa:gethostbyname in C

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

variabile di uscita deve essere stampata.

Il codice sopra riportato viene utilizzato nel driver di database MongoDB PHP per ottenere il nome host del computer (nome host fa parte di un input per generare un ID univoco). Sono scettico sul fatto che questo restituirà l'hostname, quindi mi piacerebbe qualche prova.

Qualsiasi esempio di codice sarebbe molto utile.

giorno Felice,

Matic

risposta

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; 
} 

Non è un metodo molto affidabile per determinare il nome host, sebbene a volte possa funzionare. (ciò che restituisce dipende da come è impostato /etc/hosts). Se si dispone di una riga come:

127.0.0.1 foobar localhost 

... quindi restituirà "foobar". Se si ha il contrario, che è anche comune, restituirà semplicemente "localhost". Un modo più affidabile è quello di utilizzare la funzione 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

Dovresti passare 'sizeof (hostname) -1' come lunghezza a' gethostname() '. Altrimenti si potrebbe finire senza nessuna terminazione nulla se si verifica il troncamento. Secondo la mia manpage: "POSIX.1 dice che se si verifica tale troncamento, non è specificato se il buffer restituito include un byte null terminante. " – scai

+0

@scai: Grazie, corretto. – caf

2

Cosa c'è di sbagliato?

h_name

Il nome ufficiale del host (PC). Se utilizza il sistema DNS o risoluzione simile , è il nome dominio completo (FQDN) che ha causato il server per restituire una risposta. Se si utilizza un file hosts locale , è la prima voce dopo l'indirizzo IPv4.

+0

E naturalmente DNS non sta per essere utilizzato per "localhost", quindi è il file hosts locale che è rilevante. * Se * la voce nel file hosts locale ha sia "localhost" che il reale nome host associato allo stesso indirizzo (127.0.0.1) * e * il vero nome host è la prima, allora h_name restituirà il nome host reale. –

+0

@David Gelhar: localhost non è un nome di computer. localhost si risolve in 127.0.0.1 ma non vi è alcuna conversione posteriore. http://en.wikipedia.org/wiki/Localhost – Andrey

+0

giusto, ma il punto è che se/etc/hosts assomiglia a '127.0.0.1 realname.com localhost' quindi' gethostbyname ("localhost") 'restituirà" realname .com "in h_name, ma se l'ordine viene annullato, verrà restituito" localhost "(vedere la risposta di caf). –

5

In C/UNIX, l'equivalente sarebbe qualcosa di simile:

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

e la prova che funziona:

$ hstnm localhost 
Name: demon-a21pht 

Ma provate voi stessi. A condizione che tu abbia l'ambiente corretto, dovrebbe andare bene.