[{"@context":"http:\/\/schema.org\/","@type":"BlogPosting","@id":"https:\/\/wiki.edu.vn\/wiki24\/2021\/12\/09\/getaddrinfo-wikipedia\/#BlogPosting","mainEntityOfPage":"https:\/\/wiki.edu.vn\/wiki24\/2021\/12\/09\/getaddrinfo-wikipedia\/","headline":"Getaddrinfo \u2013 Wikipedia","name":"Getaddrinfo \u2013 Wikipedia","description":"before-content-x4 Die Funktionen getaddrinfo() und getnameinfo() Konvertieren von Dom\u00e4nennamen, Hostnamen und IP-Adressen zwischen menschenlesbaren Textdarstellungen und strukturierten Bin\u00e4rformaten f\u00fcr die","datePublished":"2021-12-09","dateModified":"2021-12-09","author":{"@type":"Person","@id":"https:\/\/wiki.edu.vn\/wiki24\/author\/lordneo\/#Person","name":"lordneo","url":"https:\/\/wiki.edu.vn\/wiki24\/author\/lordneo\/","image":{"@type":"ImageObject","@id":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/44a4cee54c4c053e967fe3e7d054edd4?s=96&d=mm&r=g","height":96,"width":96}},"publisher":{"@type":"Organization","name":"Enzyklop\u00e4die","logo":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":600,"height":60}},"image":{"@type":"ImageObject","@id":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","url":"https:\/\/wiki.edu.vn\/wiki4\/wp-content\/uploads\/2023\/08\/download.jpg","width":100,"height":100},"url":"https:\/\/wiki.edu.vn\/wiki24\/2021\/12\/09\/getaddrinfo-wikipedia\/","wordCount":1511,"articleBody":" (adsbygoogle = window.adsbygoogle || []).push({});before-content-x4Die Funktionen getaddrinfo() und getnameinfo() Konvertieren von Dom\u00e4nennamen, Hostnamen und IP-Adressen zwischen menschenlesbaren Textdarstellungen und strukturierten Bin\u00e4rformaten f\u00fcr die Netzwerk-API des Betriebssystems. Beide Funktionen sind in der POSIX-Standardanwendungsprogrammierschnittstelle (API) enthalten. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4getaddrinfo und getnameinfo sind inverse Funktionen zueinander. Sie sind netzwerkprotokollunabh\u00e4ngig und unterst\u00fctzen sowohl IPv4 als auch IPv6. Es ist die empfohlene Schnittstelle f\u00fcr die Namensaufl\u00f6sung beim Erstellen protokollunabh\u00e4ngiger Anwendungen und f\u00fcr den \u00dcbergang von altem IPv4-Code zum IPv6-Internet.Intern f\u00fchren die Funktionen Aufl\u00f6sungen unter Verwendung des Domain Name System (DNS) durch, indem sie andere untergeordnete Funktionen aufrufen, beispielsweise gethostbyname().Am 16. Februar 2016 wurde ein Sicherheitsfehler in der glibc-Implementierung von getaddrinfo() bekannt, der eine Puffer\u00fcberlauftechnik verwendet, die die Ausf\u00fchrung von beliebigem Code durch den Angreifer erm\u00f6glichen kann.[1] (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4Table of Contentsstruct addrinfo[edit]getaddrinfo()[edit]freeaddrinfo()[edit]getnameinfo()[edit]Beispiel[edit]Siehe auch[edit]Verweise[edit]Externe Links[edit]struct addrinfo[edit]Die C-Datenstruktur, die verwendet wird, um Adressen und Hostnamen innerhalb der Netzwerk-API darzustellen, ist die folgende:struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; socklen_t ai_addrlen; struct sockaddr* ai_addr; char* ai_canonname; \/* canonical name *\/ struct addrinfo* ai_next; \/* this struct can form a linked list *\/};In einigen \u00e4lteren Systemen ist der Typ von ai_addrlen ist Gr\u00f6\u00dfe_t anstatt socklen_t. Die meisten Steckdosenfunktionen, wie z akzeptieren() und getpeername(), erfordern, dass der Parameter den Typ hat Socken_t * und Programmierer geben die Adresse oft an die ai_addrlen Element der Adresse Struktur. Wenn die Typen nicht kompatibel sind, z. B. auf einem 64-Bit-Solaris 9-System, wo Gr\u00f6\u00dfe_t ist 8 Byte und socklen_t 4 Byte betr\u00e4gt, k\u00f6nnen Laufzeitfehler auftreten.Die Struktur enth\u00e4lt Strukturen ai_familie und Sockenadresse mit eigenem sa_familie Bereich. Diese werden beim Erstellen der Struktur mit Funktion . auf den gleichen Wert gesetzt Getaddrinfo in einigen Implementierungen. (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4getaddrinfo()[edit]getaddrinfo() wandelt f\u00fcr Menschen lesbare Textstrings, die Hostnamen oder IP-Adressen darstellen, in eine dynamisch zugewiesene verkn\u00fcpfte Liste von struct addrinfo-Strukturen um. Der Funktionsprototyp f\u00fcr diese Funktion wird wie folgt spezifiziert:int getaddrinfo(const char* hostname, const char* service, const struct addrinfo* hints, struct addrinfo** res);Hostnamekann entweder ein Dom\u00e4nenname wie “example.com”, eine Adresszeichenfolge wie “127.0.0.1” oder NULL sein, wobei in diesem Fall die Adresse 0.0.0.0 oder 127.0.0.1 abh\u00e4ngig von den Hinweis-Flags zugewiesen wird.Servicekann eine als String \u00fcbergebene Portnummer sein, zB “80”, oder ein Dienstname, zB “echo”. Im letzteren Fall verwendet eine typische Implementierung getservbyname() die Datei abfragen \/etc\/services um den Dienst in eine Portnummer aufzul\u00f6sen.Hinweisekann entweder NULL oder an . sein Adresse Struktur mit der Art des angeforderten Dienstes.resist ein Zeiger, der auf ein neues hinweist Adresse Struktur mit den nach erfolgreichem Abschluss der Funktion abgefragten Informationen.[2] Die Funktion gibt 0 bei Erfolg und einen Fehlerwert ungleich Null zur\u00fcck, wenn sie fehlschl\u00e4gt.[3]Obwohl die Implementierungen von Plattform zu Plattform variieren, versucht die Funktion zun\u00e4chst, eine Portnummer zu erhalten, normalerweise durch Verzweigung auf Service. Wenn der Zeichenfolgenwert eine Zahl ist, wird sie in eine ganze Zahl umgewandelt und aufgerufen htons(). Wenn es sich um einen Dienstnamen handelt, wie z www, der Dienst wird mit nachgeschlagen getservbyname(), unter Verwendung des Protokolls abgeleitet von Hinweise->ai_socktype als zweiter Parameter dieser Funktion. Dann wenn Hostname gegeben (nicht NULL), ein Aufruf an gethostbyname() l\u00f6st es auf, oder sonst die Adresse 0.0.0.0 wird verwendet, wenn Hinweise->ai_flags ist eingestellt auf AI_PASSIV, und 127.0.0.1 ansonsten. Es hat eine neue zugewiesen Adresse Struktur gef\u00fcllt mit den entsprechenden sockaddr_in in einer dieser Bedingungen und f\u00fcgt auch den zu Beginn abgerufenen Port hinzu. Endlich, das **res Parameter wird dereferenziert, damit er auf ein neu zugewiesenes . verweist Adresse Struktur.[4] In einigen Implementierungen, wie der Unix-Version f\u00fcr Mac OS, ist die Hinweise->ai_Protokoll \u00fcberschreibt die Hinweise->ai_socktype Wert, w\u00e4hrend in anderen das Gegenteil der Fall ist, sodass beide mit \u00e4quivalenten Werten definiert werden m\u00fcssen, damit der Code auf mehreren Plattformen funktioniert.freeaddrinfo()[edit]Diese Funktion gibt den von der Funktion zugewiesenen Speicher frei getaddrinfo(). Als Ergebnis des letzteren ist eine verkettete Liste von addrinfo-Strukturen beginnend bei der Adresse ai, freeaddrinfo() durchl\u00e4uft die Liste und gibt jede der Reihe nach frei.void freeaddrinfo(struct addrinfo *ai);getnameinfo()[edit]Die Funktion getnameinfo() wandelt die interne bin\u00e4re Darstellung einer IP-Adresse in Form eines Zeigers in a . um struct sockaddr in Textstrings bestehend aus dem Hostnamen oder, falls die Adresse nicht in einen Namen aufgel\u00f6st werden kann, einer textuellen IP-Adressdarstellung sowie dem Service-Port-Namen oder der Nummer. Der Funktionsprototyp ist wie folgt spezifiziert:int getnameinfo(const struct sockaddr* sa, socklen_t salen, char* host, size_t hostlen, char* serv, size_t servlen, int flags);Beispiel[edit]Das folgende Beispiel verwendet getaddrinfo() um den Domainnamen aufzul\u00f6sen www.beispiel.com in seine Adressliste und ruft dann an getnameinfo() bei jedem Ergebnis, um den kanonischen Namen f\u00fcr die Adresse zur\u00fcckzugeben. Im Allgemeinen ergibt dies den urspr\u00fcnglichen Hostnamen, es sei denn, die bestimmte Adresse hat mehrere Namen kanonisch Name wird zur\u00fcckgegeben. In diesem Beispiel wird der Dom\u00e4nenname dreimal gedruckt, einmal f\u00fcr jedes der drei erhaltenen Ergebnisse.#include #include #include #include #include #ifndef NI_MAXHOST#define NI_MAXHOST 1025#endifint main(void){ struct addrinfo* result; struct addrinfo* res; int error; \/* resolve the domain name into a list of addresses *\/ error = getaddrinfo(\"www.example.com\", NULL, NULL, &result); if (error\u00a0!= 0) { if (error == EAI_SYSTEM) { perror(\"getaddrinfo\"); } else { fprintf(stderr, \"error in getaddrinfo: %sn\", gai_strerror(error)); } exit(EXIT_FAILURE); } \/* loop over all returned results and do inverse lookup *\/ for (res = result; res\u00a0!= NULL; res = res->ai_next) { char hostname[NI_MAXHOST]; error = getnameinfo(res->ai_addr, res->ai_addrlen, hostname, NI_MAXHOST, NULL, 0, 0); if (error\u00a0!= 0) { fprintf(stderr, \"error in getnameinfo: %sn\", gai_strerror(error)); continue; } if (*hostname\u00a0!= '') printf(\"hostname: %sn\", hostname); } freeaddrinfo(result); return 0;}Siehe auch[edit]Verweise[edit]Externe Links[edit]RFC 3493, Basic Socket Interface Extensions f\u00fcr IPv6 (adsbygoogle = window.adsbygoogle || []).push({});after-content-x4"},{"@context":"http:\/\/schema.org\/","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki24\/#breadcrumbitem","name":"Enzyklop\u00e4die"}},{"@type":"ListItem","position":2,"item":{"@id":"https:\/\/wiki.edu.vn\/wiki24\/2021\/12\/09\/getaddrinfo-wikipedia\/#breadcrumbitem","name":"Getaddrinfo \u2013 Wikipedia"}}]}]