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

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

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

61<br />

62 /* Socketdeskriptor schließen , Verbindung beenden */<br />

63 close( client );<br />

64 }<br />

65 }<br />

40–46<br />

48–56<br />

58–60<br />

62–63<br />

Danach muß der Socket noch von einem aktiven Socket in einen passiven,<br />

annehmenden Serversocket umgewandelt werden. Nur so können über diesen<br />

Socket im weiteren Verlauf neue Netzwerkverbindungen angenommen werden.<br />

Auch hier beendet sich das Programm im Fehlerfall sofort.<br />

Nach der erfolgreichen Initialisierung tritt das Serverprogramm in eine Endlosschleife<br />

ein. In jedem Durchlauf wartet der Timeserver zunächst <strong>mit</strong> accept()<br />

auf eine neue Netzwerkverbindung. Der Aufruf von accept() blockiert so lange,<br />

bis in der Listen-Queue des Serversockets eine fertig aufgebaute Netzwerkverbindung<br />

auftaucht. accept() legt daraufhin einen neuen Socket an <strong>und</strong><br />

liefert den zugehörigen Deskriptor zur weitern Kommunikation <strong>mit</strong> dem Client.<br />

Den Deskriptor weisen wir der Variablen client zu. Tritt beim accept()<br />

ein Fehler auf, so beendet sich das Programm. 23<br />

Anschließend wird die aktuelle Zeit in Sek<strong>und</strong>en seit dem 1. 1. 1970, 0.00 Uhr,<br />

er<strong>mit</strong>telt <strong>und</strong> in Sek<strong>und</strong>en seit dem 1. 1. 1900, 0.00 Uhr, umgerechnet. Das<br />

Ergebnis wird in die Network Byte Order übersetzt <strong>und</strong> an den anfragenden<br />

Client über<strong>mit</strong>telt. Die Kommunikation erfolgt dabei über den neuen<br />

Socketdeskriptor client <strong>und</strong> nicht über den passiven Serversocket. Auf eine<br />

Fehlerbehandlung verzichten wir an dieser Stelle absichtlich. Zum einen<br />

kann ein eventueller Fehler in diesem Szenario ohnehin nicht korrigiert werden<br />

<strong>und</strong> zum anderen ist für einen solchen Fall auch ein Programmabbruch<br />

nicht angezeigt. Allzuleicht könnte ansonsten durch einen provozierten Übertragungsfehler<br />

der Timeserver zur Aufgabe gezwungen <strong>und</strong> dadurch ein Denial<br />

of Service ausgelöst werden.<br />

Als letztes wird die Netzwerkverbindung zum Client wieder geschlossen <strong>und</strong><br />

das Programm taucht in die nächste Iteration der Endlosschleife ein. Der<br />

Server wartet also nach getaner Arbeit wieder auf neue Herausforderungen.<br />

Um diesen Timeserver <strong>mit</strong> unserem Clientprogramm aus Beispiel 4.5 testen<br />

zu können, müssen wir dort in Zeile 31 die Initialisierung der Socket-<br />

Adreßstruktur leicht abwandeln. Anstelle der Portnummer 37 tragen wir im<br />

Clientprogramm die von unserem Timeserver aus Beispiel 4.6 verwndete Portnummer<br />

1037 ein:<br />

sa.sin_port = htons( 1037 ); /* Time Server Port */<br />

23 Wir werden später noch sehen, daß ein ”<br />

Fehler“ in accept() <strong>und</strong> den anderen<br />

Socket-Funktionen nicht immer zu einem Programmabbruch führen muß. In den<br />

meisten Fällen lohnt es sich, die Ursache genauer zu inspizieren <strong>und</strong> nur in ganz<br />

bestimmten Fällen das Programm zu beenden.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!