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.

81 close( sd );<br />

82 }<br />

4.4 Namensauflösung 233<br />

83<br />

84 freeaddrinfo( ai );<br />

85 }<br />

86 else<br />

87 {<br />

88 fprintf( stderr , "Fehler in getaddrinfo(%s): %s\n",<br />

89 argv[i], gai_strerror( status ) );<br />

90 }<br />

91 }<br />

92<br />

93 exit( EXIT_SUCCESS );<br />

94 }<br />

19–22<br />

24–30<br />

32–33<br />

34–45<br />

47–63<br />

Danach initialisieren wird die hints-Struktur. Mit Hilfe von memset() füllen<br />

wir zunächst die komplette Struktur <strong>mit</strong> Null-Bytes, da<strong>mit</strong> alle Strukturelemente,<br />

denen nicht explizit ein Wert zugewiesen wird, auf Null gesetzt sind.<br />

Anschließend setzen wir das AI_CANONNAME-Flag, da<strong>mit</strong> getaddrinfo() als<br />

Ergebnis auch das Strukturelement ai_canonname <strong>mit</strong> dem kanonischen Rechnername<br />

füllt. Als Antwort wollen wir sowohl IPv4- als auch IPv6-Adressen<br />

akzeptieren <strong>und</strong> der ausgewählte Dienst soll über TCP angesprochen werden.<br />

Deshalb setzen wir das Element ai_family der hints-Struktur auf den Wert<br />

AF_UNSPEC <strong>und</strong> belegen ai_socktype <strong>mit</strong> dem Wert SOCK_STREAM.<br />

Für jede der übergebenen IP-Namen <strong>und</strong> IP-Adressen wird nun die Funktion<br />

getaddrinfo() aufgerufen. Gesucht werden dabei (laut hints-Struktur)<br />

sowohl der kanonische Rechnername als auch passende sockaddr-Strukturen,<br />

welche geeignet sind, eine Socket-Verbindung zum Timeserver auf dem Zielsystem<br />

aufzubauen. Sofern der Aufruf von getaddrinfo() erfolgreich war,<br />

also der Rückgabewert gleich Null ist, wird nachfolgend die zurückgelieferte<br />

Ergebnisliste ai ausgewertet.<br />

Mit dem Hilfszeiger aptr— iterieren wir dazu durch die <strong>mit</strong> einem Nullzeiger<br />

terminierte Ergebnisliste aus addrinfo-Strukturen.<br />

Um die er<strong>mit</strong>telte IP-Adresse auch in Textform ausgeben zu können, er<strong>mit</strong>teln<br />

wir zunächst die zurückgelieferte Adreßfamilie. Je nachdem, ob es sich<br />

um eine IPv4- oder IPv6-Adresse handelt, setzen wir zur Umwandlung eine<br />

sockaddr_in- odersockaddr_in6-Hilfsvariable ein. In jedem Fall erhalten<br />

wir in ip_address die Textdarstellung der IP-Adresse.<br />

Jetzt versuchen wir, eine TCP-Verbindung zum jeweiligen Timeserver aufzubauen.<br />

Als erstes legen wir dazu einen TCP-Socket an <strong>und</strong> verwenden<br />

dann die Socket-Adresse aus der aktuellen addrinfo-Struktur beim Aufruf<br />

von connect(). Sollte beim Verbindungsaufbau etwas schief laufen, so geben<br />

wir eine entsprechende Fehlermeldung aus <strong>und</strong> setzten die Iteration <strong>mit</strong> dem<br />

nächsten Element der Ergebnisliste fort.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!