GetHostByName -Funktion in der C -Sprache

GetHostByName -Funktion in der C -Sprache

Die C -Sprache hat eine große Anzahl von Funktionen für die Programmierung der Steckdosen. Viele von ihnen werden verwendet, um die erforderlichen Informationen vom Host zu erhalten, zu dem eine Verbindung hergestellt werden soll. Die Informationen, die diese Art von Funktion abruft.

In diesem Linux -Hinweis -Artikel erfahren Sie alles über die Funktion von GetHostByName (), die am häufigsten zur Auflösung und Abholung der IP -Adressen aus den Hostnamen verwendet wird.

Wir zeigen Ihnen die Syntax dieser Funktion und die theoretische Beschreibung der Funktionsweise, deren Eingabe- und Ausgabeargumente, des in jedem Fall verwendeten Datentyps und der korrekten Deklaration.

Wir wenden dann das an, was wir anhand der praktischen Beispiele gelernt haben, einschließlich der Code -Snippets und -Bilder, in denen wir die Funktion von GetHostByName () implementieren, um die Hostname -Adressen zu beheben und zu erhalten.

Syntax der GetHostByName () -Funktion in der C -Sprache

struct hostent *GetHostByName (const char *name);

Beschreibung der GetHostByName () -Funktion in C -Sprache

Die Funktion von GetHostByName () gibt die IP -Adresse, den offiziellen Namen und die Adresse eines Hostnamens zurück. Diese Funktion fordert den Server auf, die Adresse des Hostnamens zu beheben und zurückzugeben, der als Zeichenfolge oder Zeiger in seinem einzelnen Eingangsargumentnamen angegeben ist.

Wenn kein Fehler auftritt. Wenn ein Fehler auftritt, wird ein Nullzeiger zurückgegeben und der Fehleridentifikationscode kann über die globale H_errno -Variable abgerufen werden.

Hostnames sind in der Regel mit einer einzigen Adresse verbunden, es gibt jedoch Fälle von großen Plattformen mit mehreren zugehörigen Adressen wie „www.Google.com ”. Aus diesem Grund sind die „häuslichen“ Strukturen so konzipiert, dass sie eine Liste von Adressen enthalten. Auf jeden von ihnen kann mit dem Array "H_ADDR_LIST" von Zeigern zugegriffen werden. Weiter vorne gibt es einen speziellen Abschnitt, der alles über diese Art von Struktur erklärt.

Obwohl die GetHostByName () -Funktion als veraltet angesehen wird und durch getAddrinfo () ersetzt wurde, macht es seine Einfachheit in der Methodenaufruf und der Eingabeargumente sehr nützlich, wenn Sie nur die Adresse eines Hostnamens benötigen.

Die GetHostByName () -Funktion sowie alle anderen Funktionen der Gethostxxxxx () -Familie, die Strukturen und Variablen, die sie verwenden, werden in der „NetDB.H ”Kopfball. Sie müssen sie also wie in Folgendes in Ihren Code einbeziehen:

#enthalten

So erhalten Sie die Adresse eines Hostnamens mit der Funktion von GetHostByName () in C -Sprache

In diesem Beispiel werden wir die Funktion von GetHostByName () verwenden, um die Adresse und den offiziellen Namen des „Www.Kernel.Org ” Hostname.

Schritt 1: Der erste Schritt besteht darin, die erforderlichen Header einzufügen und eine Main () -Funktion zu erstellen, die einen leeren Wert zurückgibt.

Schritt 2: In der Funktion main () deklarieren wir den Zeigerhost einer Struktur vom Typ Hostent, die als Ausgabemargument von GetHostByName dient (). Wir deklarieren auch ein Array mit 256-Zeichen namens "Puffer", das die Zeichenfolge speichert, die den Namen des Hosts enthält, den wir als Eingabeargument übergeben.

Schritt 3: Nachdem wir die von uns verwendeten Variablen und Struktur deklariert haben, nennen wir die Funktion von GetHostByName () und geben den Puffer als Eingabeargument und die Hoststruktur als Ausgabemargum.

Schritt 4: Wenn die Funktion erfolgreich zurückgibt, besteht der nächste Schritt darin, den offiziellen Namen und die Adresse anzuzeigen. Zu diesem Zweck verwenden wir die Printf () -Funktion in zwei Aufrufen. Der erste Anruf zeigt den offiziellen Namen der Domäne, eine Zeichenfolge, auf die das H_Name -Element der Hoststruktur vermerkt ist. Der zweite Anruf zeigt die Adresse, die in H_ADDR_LIST [0] gespeichert ist, die als H_ADDR definiert ist, die wir mit der Funktion inet_ntoa () in eine Zeichenfolge konvertieren.

Das Folgende ist der vollständige Code mit allen vier Schritten für dieses Beispiel:

//Schritt 1
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
void main ()
//Schritt 2

Struchostent *Host;
Zeichenpuffer [255] = "www.Kernel.org ";
//Schritt 3
Host = GetHostByName (Buffer);
//Schritt 4
printf ("\ nip adresse von %s lautet:", host-> h_name);
printf ("%s \ n \ n", inet_ntoa (*(structin_addr*) host-> h_addr));

Das folgende Bild zeigt die Kompilierung und Ausführung dieses Code. Wie wir sehen können, erhält GetHostByName () eine Information von der „Www.Kernel.Org ” Domain und speichert es in einer „eventuellen“ Struktur.

Die häusliche Struktur

Die „hostent“ -Struktur speichert die nützlichen Daten, die vom Server bereitgestellt werden, wenn eine Abfrage mit Funktionen wie GetHostByName () erstellt wird (). Diese Socket -Verbindung wird zur Auflösung der Adressen vorgeführt und die Informationen wie den Domain -Namen, die Adressfamilie und eine Liste von Adressen zurückgegeben, wenn mehr als eins vorhanden ist. Sie können diese Struktur zusammen mit einer detaillierten Beschreibung jedes Elements im Folgenden sehen:

strukturiert häuslich

char *h_name;
char ** h_aliases;
inth_addrtype;
inth_length;
char ** h_addr_list;
#defineh_addrh_addr_list [0]
;

H_NAME: Dies ist ein Zeiger auf eine Zeichenfolge mit dem Domänennamen, für den er abgefragt wird.

H_ALIASS: Es ist eine Liste alternativer Namen.

H_ADDRTYPE: Dieses Mitglied gibt die Adressfamilie an, für die es abgefragt wird.

H_Length: Es gibt die Größe der Adresse an.

H_ADDR_LIST: Dies ist der Zeiger auf eine Liste von Adresszeigern. Wenn der Server mehr als eine Adresse für den befragten Namen zurückgibt, wird über diesen Listenzeiger auf jeden zugegriffen.

H_ADDR: Der Einfachheit halber definiert diese Struktur den H_ADDR als Zeiger auf die erste Adresse in der H_ADDR_LIST. Der Zugriff erfolgt über diese Definition.


Fehler, die auftreten können, wenn die Funktion der GetHostByName () -Funktion verwendet wird: wie man sie erkennt und identifiziert

Die Funktion von GetHostByName () gibt im Falle eines Fehlers einen Nullzeiger zurück. Der einfachste Weg, einen Fehler zu erkennen. Das Folgende ist ein Code -Snippet, das diese Technik zeigt:

if ((Host = GetHostByName (Buffer)) == NULL)
printf ("Ein Fehler ist beim Versuch aufgetreten, Informationen vom Server zu erhalten.");

Wenn ein Fehler auftritt, wird der numerische Identifikationswert automatisch in der globalen H_errno -Variablen gespeichert. Die Definitionen der Fehler und ihre numerische Darstellung sind in der angegeben „Netdb.H" Header.

Das Folgende ist ein Auszug aus dem „NetDB.h ”Kopfzeile mit den Fehlern, die die Funktion von GetHostByName () erzeugen kann, ihr numerischer Wert in H_errno und eine kurze Beschreibung jedes Fehlers:

Definition Wert Fehler
HOST NICHT GEFUNDEN 1 Host nicht gefunden.
VERSUCHEN SIE ES ERNEUT 2 Nicht autoritativ. Host nicht gefunden.
NO_RECOVERY 3 Nicht wiederherstellbarer Fehler.
KEINE DATEN 4 Gültiger Name, kein Datensatz des angeforderten Typs.

Der einfachste Weg, einen Fehler zu ermitteln. Die Sprungbedingung ist die H_errno -Variable. Jeder Fall ist die Definition jedes der gerade beschriebenen Fehler.

Lassen Sie uns nun den Code des ersten Beispiels betrachten, in dem wir diese Methode einfügen, um die Fehler in Schritt 3 zu erkennen und zu identifizieren.

//Schritt 1
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
#enthalten
void main ()
void main ()
//Schritt 2

Struchostent *Host;
Zeichenpuffer [255] = "www.000000000.com ";
//Schritt 3
if ((Host = GetHostByName (Buffer)) == NULL)
Switch (H_errno)
Fall Host_not_found:
printf ("Host nicht gefunden. Fehler %i \ n ", h_errno);
brechen;
case try_again:
printf ("nicht autoritativ. Host nicht gefunden. Fehler %i \ n ", h_errno);
brechen;
Fall NO_DATA:
printf ("Gültiger Name, kein Datenaufzeichnung des angeforderten Typs. Fehler %i \ n ", h_errno);
brechen;
Fall No_Recovery:
printf ("Nicht wiederherstellbarer Fehler. Fehler %i \ n ", h_errno);
brechen;


Anders
//Schritt 4
printf ("\ nip adresse von %s lautet:", host-> h_name);
printf ("%s \ n \ n", inet_ntoa (*(structin_addr*) host-> h_addr));

Wie Sie können. Dies führt zu einem Fehler, der im bedingten Sprungschalter identifiziert wird.

Das folgende Bild zeigt die Kompilierung und Ausführung dieses Code. In diesem Fall konnte die Funktion von GetHostByName () den Host nicht finden. Das Programm springt also zum

Host _not_ gefundener Fall der Switch -Bedingung:

Abschluss

In diesem Linux -Hinweis -Artikel haben wir Ihnen gezeigt, wie Sie mit der Funktion von GetHostByName () eine Information über einen Hostnamen erhalten. Wir haben die theoretische Beschreibung der Funktionsweise und der Funktionsweise der Eingabe- und Ausgangsargumente gelernt, einschließlich eines speziellen Abschnitts, in dem beschreibt.

Wir haben dann die Verwendung dieser Funktion in praktischen Beispielen implementiert. Dabei haben wir die Code -Snippets verwendet, um die erforderlichen Header für ihre Verwendung, die Erklärung von Strukturen und Variablen für ihre Argumente sowie die Umwandlung und Anzeige der erhaltenen Informationen anzuzeigen.

Darüber hinaus haben wir einen Abschnitt eingeschlossen, der die möglichen Fehler erläutert, die diese Funktion erzeugen kann, und die Techniken zum Erkennen und Identifizieren beigebracht werden.

Wie wir in diesem Artikel gesehen haben, bedeutet die Einfachheit dieser Funktion und ihre schnelle Implementierung, dass sie immer noch nützlich ist, obwohl sie als veraltet angesehen wurde.