05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

4.4 Namensauflösung 229<br />

Aufruf erfolgreich war, liefert getaddrinfo() in res eine verkettete Liste von<br />

addrinfo-Strukturen <strong>mit</strong> den Ergebnissen der Umwandlung zurück. Nachdem<br />

diese Ergebnisliste abgearbeitet wurde, muß sie schließlich über einen Aufruf<br />

der Funktion freeaddrinfo() wieder freigegeben werden.<br />

Über den Parameter hints wird beim Funktionsaufruf gesteuert, welche Art<br />

von Informationen getaddrinfo() zurück liefern soll. Für hints wird dazu<br />

entweder ein Null-Zeiger oder ein Zeiger auf eine entsprechend ausgefüllte<br />

addrinfo-Struktur übergeben. Je nachdem, welche Werte dann für die<br />

vier Elemente ai_flags, ai_family, ai_socktype <strong>und</strong> ai_protocol der<br />

addrinfo-Struktur eingetragen werden, ändert sich das Verhalten der Funktion.<br />

Alle anderen Felder des hints-Parameters müssen beim Aufruf von<br />

getaddrinfo() auf Null gesetzt sein, weshalb man die addrinfo-Struktur<br />

am besten vorab <strong>mit</strong> Nullbytes initialisiert.<br />

struct addrinfo<br />

{<br />

int ai_flags; /* Input flags */<br />

int ai_family; /* Address family */<br />

int ai_socktype; /* Socket type */<br />

int ai_protocol; /* Protocol of socket */<br />

socklen_t ai_addrlen; /* Socket address length */<br />

struct sockaddr *ai_addr; /* Socket address */<br />

char *ai_canonname; /* Canonical location name */<br />

struct addrinfo *ai_next; /* Pointer to next in list */<br />

}<br />

Hat ai_family den Wert AF_UNSPEC, so liefert getaddrinfo() sowohl IPv4-<br />

als auch IPv6-Adressen zurück. Mit den Werten AF_INET <strong>und</strong> AF_INET6 wird<br />

die Namensauflösung dagegen auf IPv4- bzw. IPv6-Adressen eingeschränkt.<br />

Über das Strukturelement ai_socktype kann <strong>mit</strong> Blick auf z. B. einen späteren<br />

Aufruf von connect() der gewünschte Sockettyp festgelegt werden, wobei<br />

der Wert 0 für einen beliebigen Sockettyp steht. Genauso kann über<br />

ai_protocol das gewünschte IP-Protokoll ausgewählt werden. Auch hier<br />

steht der Wert 0 für einen beliebiges IP-Protokoll.<br />

Mit dem Strukturelement ai_flags können schließlich noch weitere Details<br />

der Ergebnisliste gesteuert werden. Der Wert setzt sich durch bitweise<br />

Oder-Verknüpfung der folgenden Konstanten zusammen: AI_PASSIVE,<br />

AI_CANONNAME, AI_NUMERICHOST, AI_NUMERICSERV, AI_V4MAPPED, AI_ALL,<br />

<strong>und</strong> AI_ADDRCONFIG. Tabelle 4.8 gibt einen Überblick über die nachfolgend<br />

beschrieben Flags für das ai_flags-Element der hints-Struktur.<br />

Ist in ai_flags das Flag AI_PASSIVE gesetzt <strong>und</strong> hat der Parameter nodename<br />

den Wert NULL, so soll die zurückgelieferte Adreßinformation für ein passives<br />

Öffnen des <strong>Sockets</strong>, also einen späteren Aufruf der bind()-Funktion passend<br />

sein <strong>und</strong> die gelieferte IP-Adresse ist auf den Wert INADDR_ANY (für IPv4)

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!