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.

170 4 Gr<strong>und</strong>lagen der Socket-Programmierung<br />

6–11<br />

13–24<br />

Mit inet_ntop() wird die in Netzwerkdarstellung übergebene Adresse aus<br />

src in eine lesbare Darstellung konvertiert. Der von NULL verschiedene Zeiger<br />

dst referenziert dabei einen ausreichend großen Puffer, der die resultierende<br />

IP-Adresse in Präsentationsdarstellung aufnehmen kann. Der Parameter<br />

size gibt Auskunft über den zur Verfügung stehenden Platz im Puffer.<br />

Die beiden in definierten Konstanten INET_ADDRSTRLEN <strong>und</strong><br />

INET6_ADDRSTRLEN helfen uns dabei, den Puffer ausreichend zu dimensionieren.<br />

War die Konvertierung erfolgreich, liefert inet_ntop() die Adresse des<br />

gefüllten Puffers zurück. Andernfalls gibt die Funktion NULL zurück <strong>und</strong> errno<br />

gibt über den aufgetretenen Fehler Auskunft.<br />

Im Gegenzug konvertiert inet_pton() eine in src übergebene IP-Adresse aus<br />

der Textdarstellung in die Netzwerkdarstellung. Das Ergebnis wird im durch<br />

dst referenzierten Puffer abgelegt. War die Konvertierung erfolgreich, liefert<br />

inet_pton() den Wert 1 zurück. War die übergebene Zeichenkette nicht in<br />

gültiger gepunkteter Dezimaldarstellung (IPv4, af = AF_INET) oder korrekter<br />

Hexadezimaldarstellung (IPv6, af = AF_INET6), liefert die Funktion den<br />

Wert 0 zurück. Der Rückgabewert -1 zeigt an, daß für den Parameter af ein<br />

ungültiger Wert angegeben wurde, die Fehlervariable errno hat in diesem Fall<br />

den Wert EAFNOSUPPORT.<br />

Die Parameter src bei inet_ntop() bzw. dst bei inet_pton() sind jeweils<br />

vom Typ void *, um sowohl IPv4- als auch IPv6-Adreßstrukturen annehmen<br />

zu können. Für die Adreßfamilie AF_INET erwarten die Funktionen einen<br />

Zeiger auf die Struktur in_addr, die eine IPv4-Adresse beherbergt. Für die<br />

Adreßfamilie AF_INET6 bzw. IPv6-Adressen wird ein Zeiger auf die Struktur<br />

in6_addr übergeben.<br />

Zur Veranschaulichung der Adreßumwandlung verwandeln wir in Beispiel 4.2<br />

die an das Programm übergebenen IP-Adressen in ihre Netzwerkdarstellung<br />

<strong>und</strong> geben sie in binärer Schreibweise aus. Bei der Darstellung als Binärzahl<br />

kommt uns die Network Byte Order, also die Darstellung im Big-Endian-<br />

Format sehr gelegen. Anschließend kehren wir den Vorgang um <strong>und</strong> wandeln<br />

die Netzwerkdarstellung wieder in ihre lesbare Form zurück.<br />

Nach der Einbindung der benötigten Header-Dateien erstellen wir zunächst<br />

eine Hilfsfunktion is_ipv4(), <strong>mit</strong> deren Hilfe wir IPv4-Adressen von IPv6-<br />

Adressen unterscheiden können. Die Funktion geht alle Zeichen der in Textdarstellung<br />

übergebenen IP-Adresse durch <strong>und</strong> testet, ob die Zeichenkette<br />

ausschließlich aus Zeichen besteht, die in der gepunkteten Dezimaldarstellung<br />

zulässig sind.<br />

Eine zweite Hilfsfunktion erledigt die Ausgabe der IP-Adressen in Binärdarstellung.<br />

Der Funktion print_bitwise() wird als erstes Argument die Adreßfamilie<br />

der auszugebenden IP-Adresse übergeben. Die IP-Adresse selbst wird<br />

als Feld von vorzeichenlosen 8-Bit Werten erwartet. Dies funktioniert sowohl<br />

für IPv4-Adressen (vier 8-Bit Werte) als auch für IPv6-Adressen (sechzehn<br />

8-Bit Werte).

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!