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.3 <strong>Sockets</strong> 209<br />

50–58<br />

Die Antwort des Timeservers empfangen wir <strong>mit</strong> der recvfrom()-Funktion.<br />

An der Socket-Adresse des absendenden Diensts sind wir in diesem Beispiel<br />

nicht interessiert, weshalb wir für die letzten beiden Argumente jeweils einen<br />

Nullzeiger übergeben. Sollte recvfrom() einen Fehler anzeigen, bricht das<br />

Programm ebenfalls ab. Andernfalls wird der erfolgreiche Versand der Nachricht<br />

<strong>mit</strong> einer passenden Textausgabe angezeigt.<br />

Ein Testlauf des UDP-basierten Clientprogramms liefert auch hier das erwartete<br />

Ergebnis. Der Server antwortet auf das leere UDP-Datagramm <strong>mit</strong><br />

dem aktuellen Zeitstempel, den der Client <strong>mit</strong>tels recvfrom()-Funktion.<br />

empfängt, in ein lesbares Format wandelt <strong>und</strong> auf der Kommandozeile ausgiebt:<br />

$ ./timeclientudp 192.168.1.1<br />

Anfrage an 192.168.1.1 verschickt.<br />

Antwort von 192.168.1.1 erhalten.<br />

Sat Jun 11 10:44:21 2005<br />

Beachten Sie vor einem Testlauf natürlich wieder unbedingt, daß der Zeitdienst<br />

in der Konfiguration des Internet Dæmons aktiviert ist <strong>und</strong> daß der<br />

Dæmon selbst ebenfalls läuft. Auf den ersten Blick verhält sich das Beispielprogramm<br />

da<strong>mit</strong> so wie die TCP-Variante aus Beispiel 4.5. Der erste wesentliche<br />

Unterschied zeigt sich, sobald der Timeserver nicht läuft (z. B. indem wir<br />

den Internet Dæmon anhalten, den Zeitdienst in der Konfigurationsdatei des<br />

Dæmons deaktivieren oder ein ausgeschaltetes Rechnersystem adressieren):<br />

$ ./timeclientudp 192.168.1.1<br />

Anfrage an 192.168.1.1 verschickt.<br />

Obwohl die adressierte Gegenstelle nicht auf Anfragen wartet, kann der UDP-<br />

Client offensichtlich trotzdem erfolgreich Daten an den Zeitdienst verschicken.<br />

Das leere UDP-Datagramm wird von der sendto()-Funktion. erfolgreich auf<br />

die Reise geschickt, kommt beim adressierten Dienst auf dem Rechner <strong>mit</strong> der<br />

IP-Adresse 192.168.1.1 auf Port 37 allerdings mangels Abnehmer nie an. Der<br />

sich anschließende recvfrom()-Aufruf wartet deshalb auch vergeblich (<strong>und</strong><br />

für immer) auf eine Antwort des Zeitservers. In dieser Situation hilft nur noch<br />

ein externer Programmabbruch <strong>mit</strong> der Abbruchtaste.<br />

Die TCP-Variante des Clients aus Beispiel 4.5 im Abschnitt 4.3.3 verhält sich<br />

hier anders: Das TCP-basierte Clientprogramm entdeckt bereits während des<br />

gesicherten Verbindungsaufbaus, daß die Serverseite nicht antwortet.<br />

Verb<strong>und</strong>ene UDP-<strong>Sockets</strong><br />

Um auch für UDP-<strong>Sockets</strong> zu gewährleisten, daß offensichtliche Fehlersituationen,<br />

etwa eine nicht erreichbare Gegenstelle, erkannt <strong>und</strong> <strong>mit</strong>geteilt werden,

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!