GetAddrinfo -Funktion in der C -Sprache

GetAddrinfo -Funktion in der C -Sprache

Um einen Socket-Client-Server zu öffnen, benötigen wir einige wichtige Informationen über den Server, mit dem wir eine Verbindung herstellen möchten, z.

Dieser Verbindungsprozess erfordert die Verwendung mehrerer Funktionen, und der Aufruf an jeden von diesen hat eine bestimmte Reihenfolge, die streng befolgt werden muss. Viele dieser Funktionen werden verwendet, um die Daten von dem Server abzurufen, mit dem Sie eine Verbindung herstellen möchten. Ihre Ergebnisse sind einige der Eingabeargumente für die nachfolgende Funktion.

Diese Argumente sind Deskriptoren und Datenstrukturen, die die Client- und serverspezifischen Informationen zu einigen der Ebenen enthalten, aus denen eine Netzwerkverbindung besteht.

In diesem Linux -Hinweis Artikel, Sie werden lernen, wie man das benutzt getAddrinfo () Funktion zur Behebung der IP -Adresse eines Hostnamens und die erforderlichen Informationen in den Datenstrukturen, mit denen die verschiedenen C -Funktionen eine Verbindung zu einem Remote -Server herstellen.

Wir werden eine Beschreibung der Syntax-, Argumente- und Eingangs-/Ausgabestrukturen sehen. Anschließend werden wir das anwenden, was wir in einem praktischen Beispiel gelernt haben, das Code -Snippets und Bilder enthält, die zeigen, wie die Verwendung der verwendet werden getAddrinfo () Funktion in c.

Die Verwendung dieser Funktion erfordert ein Verständnis der Datenstrukturen, die ihre Eingabeargumente ausmachen. Aus diesem Grund haben wir einen speziellen Abschnitt in diesen Artikel aufgenommen, der seine Komposition, die Art der Daten seiner Mitglieder, den von ihnen festgelegten Parameter und die Änderung dieses Parameters beschreibt, und die von jeweils festgelegte Parameter.

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

int getAddrinfo (const char *node,
const char *Service,
const struct addrinfo *Hinweise,
struct addrinfo ** res);

Beschreibung der GetAddrinfo () -Funktion in der C -Sprache

Der getAddrinfo () Die Funktion löst die IP -Adresse einer Domäne auf und führt eine Informationsüberschreitung mit dem Server für die grundlegenden Daten durch, die zum Öffnen eines Sockets erforderlich sind.

Die IP -Adresse, die durch diese Funktion aufgelöst wird.

Um besser zu verstehen, wie GetAddrinfo () funktioniert, müssen wir wissen, was seine Eingabeargumente sind. Das Folgende ist eine Liste dieser Argumente zusammen mit einer Erklärung der Funktion, die jeder von ihnen in getAddrinfo () ausführt:

Knoten: Eine Zeichenfolge oder ein Zeiger darauf, der den Domänennamen oder die IP -Adresse angibt, aus der wir die Informationen abrufen möchten. Wenn der Knoten ein Hostname ist, getAddrinfo () Entschlossen zu seiner IP -Adresse. Dieses Eingabargument akzeptiert einen IPv4-, IPv6- oder Domänennamen.

Service: Eine Zeichenfolge oder ein Zeiger darauf, der den Diensttyp oder die Portnummer angibt, mit der die Sockel angeschlossen werden soll. Dieses Eingabargument kann als Null übergeben werden, solange der Knoten einen gültigen Hostnamen oder eine gültige Adresse angibt.

Hinweise: Dieses Eingabeargument ist eine Struktur von ADDRINFO Geben Sie ein, wobei jedes seiner Mitglieder den Domänennamen und die Art der Verbindung an den Server angibt. Diese Parameter liefern Informationen über das Transportprotokoll, die IP -Version, die wir verwenden möchten, usw. Auf diese Weise werden die vom Server bereitgestellten Informationen nach Möglichkeit auf diese Art von Verbindung abzielen. Später werden wir einen Abschnitt über diese Struktur, die einzelnen Parameter sehen, die von ihren Mitgliedern festgelegt werden, und wie die Verbindung durch sie konfiguriert werden.

res: Dieses Argument ist eine Struktur des Addrinfo -Typs, in dem die vom Server zurückgegebenen Informationen gespeichert werden. Res Enthält eine Struktur und einen Zeiger auf diese Struktur oder eine Liste von Strukturen des Sockaddr -Typs, die die Adresse des Hostnamens speichern, der gesendet wird Knoten und vom Server behoben. Diese Struktur enthält den gleichen Informationstyp von Hinweise in seinen Mitgliedern, aber mit den Daten vom Server. Diese Informationen werden dann als Eingabeargument für die Funktionen Bind () und Connect () verwendet, um die Verbindung herzustellen.

In Fällen, in denen der Server mehr als eine Adresse zurückgibt, kann jeder mit dem zugegriffen werden ai_next Zeiger, der Mitglied der ist res Struktur.

Wenn der getAddrinfo () Die Funktion erhält die Informationen erfolgreich, sie gibt 0 zurück. Wenn ein Fehler auftritt, gibt diese Funktion den Code aus einer Liste zurück, die in der „NetDB“ definiert ist.H ”Kopfball.

Später finden Sie einen Abschnitt, der sich mit Fehlern befasst, wenn Sie diese Funktion verwenden, und die Definitionen mit ihren jeweiligen numerischen Darstellungen, die von getAddrinfo zurückgegeben werden ().

Der getAddrinfo () Die Funktion ist in der „netdb.H ”Kopfball. Um es zu verwenden, muss es in unserem Code wie folgt aufgenommen werden:

#enthalten

So beheben Sie die IP -Adresse einer Domäne mit der Funktion getadDrinfo () in c

In diesem Beispiel erläutern wir, wie die IP-Adresse einer Domäne behoben und die erforderlichen Parameter vom Server in den ADDRINFO- und SOCKADDR-Strukturen abgerufen werden, um eine Client-Server-Verbindung dazu herzustellen.

Der erste Schritt besteht darin, die Strukturen und Variablen zu definieren, die für die Eingabe- und Ausgangsargumente von benötigt werden getAddrinfo (). Lassen Sie uns als nächstes die Definition der Variablen betrachten, die wir in diesem Beispiel verwenden werden, und die richtige Art, die zu deklarieren ADDRINFO Strukturen:

im Terror;
char hostname [100] = "www.LinuxHints.com ";
struct addrinfo Hints_1, *res_1;


Der Fehler Variable ist das Ausgangsargument von getAddrinfo (). Wir verwenden es, um die möglichen Fehler zu erkennen. Der Hostname Das Zeichenarray enthält die Zeichenfolge mit dem Domänennamen und ist das Eingabebuchargument, Knoten.

Der tipps_1 "Vorschläge" dem Server die Art der Verbindung, die wir herstellen möchten. REs_1 ist die Struktur, die getAddrinfo () Gibt mit den Serverdaten und der Domänenadresse zurück.

Es ist wichtig, dass Sie alle Parameter des tipps_1 Struktur zu Nullzeichen. In diesem Beispiel verwenden wir die Funktion memset (), um den Speicherplatz zu setzen, der dieser Struktur auf das Nullzeichen zugeordnet ist.

Sobald die Variablen und Strukturen definiert sind, nennen wir die getAddrinfo () funktionieren und übergeben die Hostname Array als Eingabeargument, Knoten, mit dem Domainnamen, dessen IP -Adresse wir bekommen möchten. In diesem Fall verwenden wir die Adresse unserer Website - „Www .LinuxHint.com ”

Im Eingabemargument Service, Wir können angeben, dass der angeforderte Dienst "http" oder die Portnummer 80 ist, die gleich ist.

Das dritte und vierte Eingabeargumente sind die Strukturen tipps_1 Und res_1, bzw.

Das Ausgangsargument ist Fehler mit was wir bestimmen, ob getAddrinfo () kehrt mit Fehlern zurück oder führt die Operation erfolgreich durch.

Wenn getAddrinfo () kehrt erfolgreich die Strukturen zurück, auf die durch res_1 Enthält die IP -Adresse, die der angegebenen Domäne und alle Serverparameter entspricht, die von den Funktionen Bind () und Connect () in der Funktionen benötigt werden Sockaddr Geben Sie Strukturen ein, um eine Verbindung dazu herzustellen.

Um herauszufinden, ob ein Fehler auftritt, geben wir das Ergebnis in der Befehlskonsole aus. Als nächstes sehen wir den vollständigen Code für dieses Beispiel, der die Header enthält, die Variablen und Strukturen definiert und die aufruft getAddrinfo () Funktion.

#enthalten
#enthalten
#enthalten
int main ()

im Terror;
char hostname [100] = "www.LinuxHints.com ";
struct addrinfo Hints_1, *res_1;
memset (& filts_1, '\ 0', sizeof (Hints_1));
Fehler = getAddrinfo (Hostname, "80", & Hints_1, & res_1);
printf ("\ nError: %i \ n", error);


Wie wir im folgenden Bild sehen können, gibt die GetAddrinfo -Funktion ohne Fehler zurück:

So konvertieren Sie die vom Server zurückgegebene IP -Adresse in einer Addrinfo -Struktur in die String -Struktur

In vielen Fällen ist es nützlich, die vom Server zurückgegebene IP -Adresse zu konvertieren, wenn die Funktion getadDrinf () zu einer Zeichenfolge gerufen wird. Diese Adresse wird im 14-Element-Charakter-Array gespeichert, sa_data, In der Sockaddr -Struktur, die Mitglied der Res -Struktur des Addrinfo -Typs ist.

Obwohl die Adresse in einer Reihe von Elementen von gespeichert ist verkohlen Typ, sie haben kein Zeichenformat, sondern eine numerische Darstellung von Ganzzahlen von 0 bis 255.

In der IP V4 -Familie der erste Wert der sa_data Array ist immer Null und der zweite Wert ist die Portnummer. Die Elemente, die wir zum Konvertieren benötigen, sind 2, 3, 4 und 5.

Wir führen die Konvertierung mit der Funktion inet_ntop () aus. Diese Funktion wandelt die Binärzahlen im SA_DATA -Array in Zeichen um und gibt sie im IP -Array zurück.

Da die Bytes, die die IP -Nummer angeben.

#enthalten
nicht signiert char ip [50] = "";
if (error == 0)
inet_ntop (af_inet, & res_1-> ai_addr-> sa_data [2], ip, sizeof (ip));
printf ("IP -Adresse: %s \ n \ n", IP);


Wenn wir dieses Fragment am Ende des Code des vorherigen Beispiels einfügen, sehen wir die IP, die dem Hostnamen entspricht, den wir an den Server senden, um seine Adresse zu beheben.

#enthalten
#enthalten
#enthalten
int main ()

int a;
nicht signiertes char b [5] = "";
nicht signiert char ip [50] = "";
im Terror;
char hostname [100] = "www.LinuxHints.com ";
struct addrinfo Hints_1, *res_1;
memset (& filts_1, '\ 0', sizeof (Hints_1));
Fehler = getAddrinfo (Hostname, "80", & Hints_1, & res_1);
printf ("\ nError: %i \ n", error);
#enthalten
nicht signiert char ip [50] = "";
if (error == 0)
inet_ntop (af_inet, & res_1-> ai_addr-> sa_data [2], ip, sizeof (ip));
printf ("IP -Adresse: %s \ n \ n", IP);


In der folgenden Abbildung sehen wir die IP -Adresse, die dem Hostnamen entspricht, den wir aus der addrinfo res_1 -Struktur abrufen und in eine Zeichenfolge für inet_ntop () konvertieren:

Addrinfo -Struktur

Die Mitglieder der ADDRINFO Die Struktur ist dafür verantwortlich, den Server über bestimmte Parameter des Socket zu informieren, die geöffnet werden sollen. Diese Parameter werden in der Struktur angegeben, die als Eingabeargumente in gesendet wird Hinweise. Der Server antwortet, indem er die Informationen sendet, die in einer ähnlichen Struktur gespeichert sind, deren Zeiger als Eingabebuchargument in gesendet wird res.

Die zurückgegebenen Informationen sind eine Konfiguration, die der Konfiguration übereinstimmt oder der in der vorgeschlagenen Konfiguration ist Hinweise Basierend auf den Funktionen des Servers. Wenn Sie beispielsweise eine Konfiguration für IPv6 -Adressen erstellen möchten, können nicht alle Server diese Art von Familie verarbeiten.

Als nächstes sehen wir uns die einzelnen Elemente der Struktur ausführlich und welche Parameter sie festlegen.

Struktur addrinfo

int ai_flags; /* Eingangsflaggen. */
int ai_family; /* Protokollfamilie für Socket. */
int ai_socktype; /* Steckdosentyp. */
int ai_protocol; /* Protokoll für Socket. */
SOCKLEN_T AI_ADDRLEN; /* Länge der Sockeladresse. */
struct sockaddr *ai_addr; /* Socket -Adresse für Socket. */
char *ai_cannonname; /* Kanonischer Name für den Serviceort. */
struct addrinfo *ai_next; /* Zeiger auf die nächste in der Liste. */
;


Schauen wir uns die folgenden einzelnen Felder der Addrinfo -Struktur und die Parameteroptionen für jedes Feld an:

ai_flags: Dies sind Kontrollflags, die in eine Ganzzahl zusammengefasst sind. Um einen von ihnen auf 0 oder 1 festzulegen, müssen Sie einen bitgewiären logischen Betrieb zwischen der Ganzzahl und einer Maske ausführen, die nur die ausgewählten Bits ändert. In unserem Artikel „Bitwise Operatoren in C“ erläutern wir Schritt für Schritt, wie die logischen Operationen mit Masken durchgeführt werden können.

Lassen Sie uns als nächstes das Fragment des „NetDB“ betrachten.H ”-Header, bei dem diese Flags mit einer kurzen Beschreibung jedes einzelnen definiert sind:

/* Mögliche Werte für 'Ai_Flags' Feld in der 'adrinfo' Struktur. */
# Definieren Sie ai_passive 0x0001 // Die Adresse ist für 'Bind' bestimmt '.
# Definieren Sie ai_canonname 0x0002 // Anfrage nach kanonischem Namen.
# Definieren Sie ai_numerichost 0x0004 // Verwenden Sie keine Namensauflösung.
# Definieren Sie AI_V4MADK 0x0008 // IPv4 zugeordneten Adressen.
# Definieren Sie ai_all 0x0010 // IPv4 kartieren und IPv6 zurückgeben
# Definieren Sie ai_addrconfig 0x0020 // Verwenden Sie die Konfiguration dieses Hosts
// wählen
// zurückgegebener Adresstyp.
# ifdef __USE_gnu
# Definieren Sie ai_idn 0x0040 // idn codieren input // im aktuellen Gebietsschema
// Zeichensatz (Colation)
// bevor nach oben nachsieht.
# Definieren Sie ai_canoidn 0x0080 // Der kanonische Name von übersetzen
// IDN -Format.
# Definieren Sie ai_idn_allox
// Unicode -Codepunkte.
# Definieren Sie ai_idn_use_std3_ascii_Rules 0x0200 // Zeichenfolgen validieren
// entsprechend
// std3 Regeln.


Die Manipulation der Flags ohne volles Wissen kann zu Fehlern führen, die schwer zu diagnostizieren sind. Daher ist es ratsam, dieses Feld in seiner Standardkonfiguration zu verwenden.

ai_family: Diese Ganzzahl gibt eine von zwei Adressfamilienoptionen an, die der Server zurückgeben sollte. Die Adressfamilienoptionen sind:

AF_INET für IPv4 -Adressen.

AF_INET6 für IPv6 -Adressen.

AF_Unspec kann eine der beiden Familien zurückgeben.

ai_socktype: Diese Ganzzahl legt das Transportprotokoll für die Sockel fest. Die Typoptionen sind:

SOCK_STREAM für TCP -Protokoll

SOCK_DGRAM für UDP -Protokoll

ai_addrlen: Dieses Feld gibt die Größe der Socket -Adresse an.

Ai_addr: In dieser Struktur vom Typ Sockaddr wird die Adresse des Sockels gespeichert.

ai_next: Wenn der Server über mehr als eine Adresse verfügt, wird mehrere Strukturen des Sockaddr -Typs zurückgegeben, der jeweils eine andere Adresse enthält. Der AI_Next ist der Zeiger auf die Liste der Strukturen, mit denen Sie auf jede Struktur zugreifen können.

So setzen Sie die Socket -Parameter in den Feldern der ADDRINFO STRUCT

Die Parameter der Addrinfo -Struktur müssen festgelegt werden, bevor Sie den GetAddrinfo aufrufen (). Sie können sie auf folgende Weise ändern:

Strukturname . Feld = Wert;


Wenn wir beispielsweise die Familie der IPv6 -Adressen in der RES_1 -Struktur des vorherigen Beispiels auswählen möchten, müssen wir Folgendes tun:

res_1 . ai_family = af_inet6

Fehler, die durch die Funktion getAddrinfo () in C -Sprache zurückgegeben wurden

Wenn ein Fehler auftritt, wenn der getAddrinfo () Die Funktion wird aufgerufen, sie gibt einen numerischen Wert zurück, der angibt, was der Fehler ist. Als nächstes sehen wir ein Fragment des „netdb.H ”Kopfball, in dem diese Fehler und ihre numerische Darstellung definiert sind.

/* Fehlerwerte für die Funktion 'getAddrinfo'. */
# Definieren Sie EAI_BADFLAGS -1 // Ungültiger Wert für das Feld 'AI_FLAGS'.
# Definieren Sie EAI_NONAME -2 // Name oder Dienst ist unbekannt.
# Definieren Sie EAI_AGAIN -3 // vorübergehender Fehler in der Namensauflösung.
# Definieren Sie EAI_FAIL -4 // Nicht -rekundierbarer Fehler im Namen res.
# Definieren Sie EAI_Family -6 // 'ai_family', die nicht unterstützt werden.
# Definieren Sie EAI_SOCKTYPE -7 // 'ai_socktype', die nicht unterstützt werden.
# Definieren Sie EAI_Service -8 // Service nicht unterstützt ai_socktype '
# Definieren Sie EAI_MEMORY -10 // Speicherzuweisungsversagen.
# Definieren Sie EAI_SYSTEM -11 // Systemfehler, die in 'Errno' zurückgegeben wurden.
# Definieren Sie EAI_Overflow -12 // Argumentpufferüberlauf.
# ifdef __USE_gnu
# Definieren Sie EAI_NODATA -5 // Keine mit dem Namen zugeordnete Adresse zugeordnet.
# Definieren Sie die EAI_ADDRFamily -9 // Die Familie für den Namen nicht unterstützt.
# Definieren Sie EAI_InProgress -100 // Bearbeitungsanforderung in Bearbeitung.
# Definieren Sie EAI_Canceled -101 // Anforderung storniert.
# Definieren Sie EAI_NOTCANGELED -102 // Anfrage nicht storniert.
# Definieren Sie EAI_ALLDone -103 // Alle Anfragen erfolgen.
# Definieren Sie EAI_INTR -104 // durch ein Signal unterbrochen.
# Definieren Sie EAI_IDN_CODE -105 // IDN -Codierung fehlgeschlagen.

Abschluss

In diesem Linux -Hinweise Artikel, wir haben erklärt, wie man das benutzt getAddrinfo () Funktion zur Behebung der IP -Adresse einer Domäne und die erforderlichen Informationen vom Server zum Öffnen eines Socket.

Wir haben uns die Syntax dieser Funktion angesehen und jedes seiner Eingabemarions, die Art der in ihnen verwendeten Daten und ihren Zweck innerhalb der Funktion im Detail beschrieben. Um zu verstehen, wie Sie mit dieser Funktion umgehen können, haben wir zwei spezielle Abschnitte erstellt, in denen erläutert wird, wie die ADDRINFO -Strukturen erstellt werden, welche Parameter jedes seiner Mitglieder behandelt und wie Sie sie ändern können, um die Verbindung zu konfigurieren.

Wir hoffen, dass Sie diesen Artikel nützlich gefunden haben. Weitere Artikel über die C -Sprache und für Linux -Hinweise, Bitte verwenden Sie die Suchmaschine auf unserer Website.