Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

getaddrinfo() - Informationen über Rechnernamen, Rechneradressen und Services protokollunabhängig abfragen

&pagelevel(4)&pagelevel

#include <netdb.h>

int getaddrinfo(char *nodename, char *servname, struct addrinfo *hints,
                struct addrinfo **res);

Beschreibung

Mit der Funktion getaddrinfo() liefert protokollunabhängig Rechnerinformationen für die Adressfamilien AF_INET und AF_INET6. Die Werte werden entweder über den Domain Name Service (DNS) oder über systemspezifische Tabellen ermittelt.

Parameter nodename und servname

Beim Aufruf von getaddrinfo() muss mindestens einer der Parameter nodename oder servname vom Null-Zeiger verschieden sein. nodename und servname sind entweder ein Null-Zeiger oder ein mit dem Null-Byte abgeschlossener String. Der Parameter nodename kann sowohl ein Name sein, als auch eine IPv4-Adresse in dezimaler Punkt-Notation oder eine IPv6-Adresse in sedezimaler Doppelpunkt-Notation. Der Parameter servname kann entweder ein Service-Name oder eine dezimale Portnummer sein.

Parameter hints

Mit dem Parameter hints wird optional eine addrinfo-Struktur übergeben. Andernfalls muss der Parameter hints der Null-Zeiger sein.

Die Struktur addrinfo ist wie folgt deklariert:

struct addrinfo {
    int ai_flags;               /* AI_PASSIVE, AI_CANONNAME */
    int ai_family;              /* AF_INET, AF_INET6 */
    int ai_socktype;            /* SOCK_STREAM, SOCK_DGRAM */
    int ai_protocol;            /* 0 oder IPPROTO_xxx für IP */
    size_t ai_addrlen;          /* Länge von ai_addr */
    char*ai_canonname;          /* kanonischer Name */
    struct sockaddr *ai_addr;   /* Socket-Adress-Struktur */
    struct addrinfo *ai_next;   /* nächste Struktur der Liste */
};

In dem mit hints übergebenen Objekt vom Typ struct addrinfo müssen alle Elemente außer ai_flags, ai_family und ai_socktype den Wert 0 haben bzw. der Null-Zeiger sein.

Mit den Werten für die addrinfo-Komponenten ai_flags, ai_family und ai_socktype legen Sie eine Auswahl fest:

  • ai_family = PF_UNSPEC bedeutet, dass jede Protokollfamilie gewünscht ist.

  • ai_socktype = 0 bedeutet, dass jeder Socket-Typ akzeptiert ist.

  • ai_flags = AI_PASSIVE bedeutet, dass die zurückgelieferte Sockets-Adress-Struktur für einen bind()-Aufruf verwendet werden soll. Wenn nodename = NULL ist (siehe oben), wird das IP-Adresselement bei einer IPv4-Adresse mit INADDR_ANY und bei einer IPv6-Adresse mit IN6ADDR_ANY versorgt.

  • Wenn das AI_PASSIVE-Bit nicht gesetzt ist, wird die zurückgelieferte Socket-Adress-Struktur wie folgt verwendet: 

    • für einen connect()-Aufruf bei ai_socktype = SOCK_STREAM

    • für einen connect()-, sendto()- oder sendmsg()-Aufruf bei ai_socktype = SOCK_DGRAM

    Wenn in diesen Fällen nodename der Null-Zeiger ist, wird die IP-Adresse von sockaddr mit dem Wert der loopback-Adresse versorgt.

  • Wenn das Bit ai_flags = AI_CANONNAME gesetzt ist, enthält bei erfolgreicher Ausführung von getaddrinfo() die erste zurückgegebene addrinfo-Struktur im Element ai_canonname den Socket-Hostnamen des ausgewählten Rechners. Dieser Socket-Hostname ist mit dem Null-Byte abgeschlossen.

  • Wenn das Bit ai_flags = AI_NUMERICHOST gesetzt ist, muss ein vom Null-Zeiger verschiedener nodename entweder ein IPv4-Adress-String in dezimaler Punkt-Notation oder ein IPv6-Adress-String in sedezimaler Doppelpunkt-Notation sein. Andernfalls wird der Returnwert EAI_NONAME geliefert. Das Flag verhindert einen Aufruf zur Namensauflösung durch einen DNS-Service oder interne Rechnertabellen.

hints = NULL bewirkt das Gleiche wie eine mit 0 initialisierte addrinfo-Struktur mit ai_family = PF_UNSPEC.

Parameter res

Bei erfolgreicher Ausführung von getaddrinfo() wird in res ein Zeiger auf eine oder mehrere miteinander verkettete addrinfo-Strukturen übergeben. Das Element ai_next = NULL kennzeichnet das letzte Kettenelement. Jede der zurückgelieferten addrinfo-Strukturen enthält in den Elementen ai_family und ai_socktype einen zum socket()-Aufruf korrespondierenden Wert. ai_addr zeigt immer auf eine Socket-Adress-Struktur, deren Länge in ai_addrlen spezifiziert ist.

Returnwert

0:

Bei Erfolg.

>0:

Fehler, Returnwert ist ein in <netdb.h> definierter Fehlercode EAI_xxx.

-1:

Fehler, errno wird gesetzt, um den Fehler anzuzeigen

Fehler

EAFNOSUPPORT

Die Funktion wird an diesem System nicht unterstützt. Vergleichen Sie dazu auch "Abhängigkeiten vom BS2000-Transportsystem BCAM".

In <netdb.h> definierte Fehlercodes:

EAI_ADDRFAMILY

Die Adressfamilie wird für den angegebenen Rechner nicht unterstützt.

EAI_AGAIN

Temporärer Fehler beim Zugriff auf die Rechnernamen-Information (z.B. DNS-Fehler).
Der Aufruf der Funktion sollte wiederholt werden.

EAI_BADFLAGS

Ungültiger Wert für den Operanden ai_flags.

EAI_FAIL

Fehler beim Zugriff auf die Rechnernameninformation.

EAI_FAMILY

Die Protokoll-Familie wird nicht unterstützt.

EAI_MEMORY

Fehler bei Speicheranforderung.

EAI_NODATA

Keine zum Rechnernamen korrespondierende Adresse gefunden.

EAI_NONAME

Rechner- oder Service-Name werden nicht unterstützt, oder sind unbekannt.

EAI_SERVICE

Service wird für den Socket-Typ nicht unterstützt.

EAI_SOCKTYPE

Der Socket-Typ wird nicht unterstützt.

EAI_SYSTEM

System-Fehler, wird in errno näher spezifiziert.

Hinweis

Der Speicher für die von getaddrinfo() gelieferten addrinfo-Strukturen wird dynamisch angefordert und muss mit der Funktion freeaddrinfo() wieder freigegeben werden.