gethostbyname in C

Lesezeit: 3 Minuten

Benutzeravatar von Matic
Matic

Ich weiß nicht, wie man Anwendungen in C schreibt, aber ich brauche ein kleines Programm, das Folgendes tut:

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

Ausgangsvariable gedruckt werden soll.

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

Irgendwelche Codebeispiele wären am hilfreichsten.

Glücklicher Tag.

Benutzeravatar von caf
Café

#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 Methode, um den Hostnamen zu ermitteln, obwohl es manchmal funktionieren kann. (was es zurückgibt, hängt davon ab, wie /etc/hosts ist eingerichtet). Wenn Sie eine Zeile haben wie:

127.0.0.1    foobar    localhost

… dann wird “foobar” zurückgegeben. Wenn Sie es jedoch umgekehrt haben, was auch üblich ist, wird nur “localhost” zurückgegeben. Ein zuverlässigerer Weg ist die Verwendung von gethostname() Funktion:

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

  • Du solltest bestehen sizeof(hostname) -1 als Länge zu gethostname(). Andernfalls könnten Sie ohne Nullterminierung enden, wenn eine Kürzung auftritt. Laut meiner Manpage: “POSIX.1 sagt, dass bei einer solchen Kürzung nicht angegeben ist, ob der zurückgegebene Puffer ein abschließendes Nullbyte enthält.”

    – scai

    24. Januar 2017 um 12:08 Uhr

  • @scai: Danke, behoben.

    – Café

    24. Januar 2017 um 13:40 Uhr

Benutzeravatar von paxdiablo
paxdiablo

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 der Beweis, dass es funktioniert:

$ hstnm localhost
Name: demon-a21pht

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

Was ist falsch?

h_name

Der offizielle Name des Hosts (PC). Wenn Sie das DNS oder ein ähnliches Auflösungssystem verwenden, ist es der vollqualifizierte Domänenname (FQDN), der dazu geführt hat, dass der Server eine Antwort zurückgibt. Bei Verwendung einer lokalen Hosts-Datei ist dies der erste Eintrag nach der IPv4-Adresse.

  • Und natürlich wird DNS nicht für “localhost” verwendet, also ist die lokale Hosts-Datei relevant. Wenn Der Eintrag in der lokalen Hosts-Datei hat sowohl “localhost” als auch den echten Hostnamen, der mit derselben Adresse verknüpft ist (127.0.0.1). Und der echte Hostname ist der erste Eintrag, dann gibt h_name den echten Hostnamen zurück.

    – David Gelhar

    19. Mai 2010 um 13:02 Uhr


  • @David Gelhar: localhost ist kein Computername. localhost wird in 127.0.0.1 aufgelöst, aber es gibt keine Rückkonvertierung. en.wikipedia.org/wiki/Localhost

    – Andrej

    19. Mai 2010 um 13:33 Uhr

  • richtig, aber der Punkt ist, dass if /etc/hosts so aussieht 127.0.0.1 realname.com localhost Dann gethostbyname("localhost") gibt “realname.com” in h_name zurück, aber wenn die Reihenfolge umgekehrt wird, wird “localhost” zurückgegeben (siehe Antwort von caf).

    – David Gelhar

    19. Mai 2010 um 14:06 Uhr

1443960cookie-checkgethostbyname in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy