2010-05-19 11 views
11

Ich weiß nicht, wie Anwendungen in C zu schreiben, aber ich brauche ein kleines Programm, das tut:gethostbyname in C

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

Ausgangsgröße gedruckt werden soll.

Der obige Code wird im PHP MongoDB Datenbanktreiber verwendet, um den Hostnamen des Computers zu erhalten (Hostname ist Teil einer Eingabe, um eine eindeutige ID zu generieren). Ich bin skeptisch, dass dies den Hostnamen zurückgibt, also hätte ich gerne einen Beweis.

Alle Codebeispiele wären am hilfreichsten.

Happy day,

Matic

Antwort

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

Es ist keine sehr zuverlässige Möglichkeit, den Hostnamen zu bestimmen, obwohl es manchmal funktioniert. (Was es zurückgibt, hängt davon ab, wie /etc/hosts eingerichtet ist). Wenn Sie eine Zeile wie haben:

127.0.0.1 foobar localhost 

... dann wird "foobar" zurückgegeben. Wenn Sie es umgekehrt haben, was auch üblich ist, wird es nur "localhost" zurückgeben. Eine zuverlässigere Art und Weise ist die gethostname() Funktion zu verwenden:

#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

Sie sollten 'sizeof (hostname) -1' als Länge an' gethostname() 'übergeben. Andernfalls könnte es sein, dass Sie keine Null-Terminierung erhalten, wenn die Trunkierung auftritt. Laut meiner Manpage: "POSIX.1 besagt, dass bei einer solchen Kürzung nicht angegeben wird, ob der zurückgegebene Puffer ein abschließendes Nullbyte enthält. " – scai

+0

@scai: Danke, behoben. – caf

2

was ist falsch?

h_name

Der offizielle Name des Hosts (PC). Wenn das DNS oder eine ähnliche Auflösung System verwendet, ist es der voll qualifizierte Domain Name (FQDN), der den Server verursachte, eine Antwort zurückzugeben. Wenn Sie eine lokale Hosts-Datei verwenden, ist dies der erste Eintrag nach der IPv4-Adresse.

+0

Und natürlich DNS wird nicht für „localhost“ verwendet werden, so dass es die lokale Hosts-Datei ist, das ist relevant. * Wenn * der Eintrag in der lokalen hosts-Datei sowohl "localhost" als auch der echte Hostname mit der gleichen Adresse (127.0.0.1) * und * hat, ist der echte Hostname der erste Eintrag, dann gibt h_name den echten Hostnamen zurück. –

+0

@David Gelhar: localhost ist kein Name von Computer. localhost wird in 127.0.0.1 aufgelöst, aber es gibt keine Rückkonvertierung. http://en.wikipedia.org/wiki/Localhost – Andrey

+0

richtig, aber der Punkt ist, dass wenn/etc/hosts aussieht wie '127.0.0.1 realname.com localhost' dann' gethostbyname ("localhost") 'wird" realname .com "in h_name, aber wenn die Reihenfolge umgekehrt wird, wird" localhost "zurückgegeben (siehe Antwort von caf). –

5

In C/UNIX, wäre das Äquivalent so etwas wie:

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

und den Beweis, dass es funktioniert:

$ hstnm localhost 
Name: demon-a21pht 

Aber versuchen Sie es selbst. Vorausgesetzt, Sie haben die richtige Umgebung, sollte es in Ordnung sein.