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.

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

neuen Verbindungen mehr annehmen. Der originale, horchende Socket dient<br />

weiterhin dazu, eingehende Verbindungen <strong>mit</strong> accept() entgegenzunehmen.<br />

Im Fehlerfall liefert accept() den Wert -1 zurück <strong>und</strong> errno ist entsprechend<br />

der Fehlerursache gesetzt.<br />

Serverprogramm für das Time-Protokoll<br />

1–29<br />

31–38<br />

Das nachfolgende Beispiel illustriert die Anwendung der accept()-Funktion.<br />

Das Programm aus Beispiel 4.6 bildet das Gegenstück zu Beispiel 4.5 <strong>und</strong><br />

implementiert die Server-Seite des in RFC 868 beschriebenen Time-Protokolls.<br />

Einzig die Portnummer, an der das Beispiel auf eingehende Verbindungen wartet,<br />

weicht von der Spezifikation aus RFC 868 ab: Wir verwenden Port 1037<br />

anstatt Port 37. Durch diese minimale Abwandlung wird es möglich, daß beide<br />

Programme, also der original <strong>Unix</strong> Timeserver <strong>und</strong> unsere eigene Implementierung,<br />

gleichzeitig aktiv sind <strong>und</strong> von uns getestet werden können.<br />

Der Anfang von Beispiel 4.6 entspricht weitgehend dem bekannten Programmtext<br />

aus Beispiel 4.5. Bemerkenswert ist lediglich, daß das Serverprogramm<br />

zwei verschiedene Socketdeskriptoren vereinbart, sd für den annehmenden<br />

Socket sowie client für die Socketverbindung zum Client, <strong>und</strong> daß die Socket-<br />

Adreßstruktur <strong>mit</strong> einer IPv4-Wildcard-Adresse initialisiert wird. Letzteres<br />

bewirkt, daß der Server auf allen lokal verfügbaren IPv4-Adressen auf eingehende<br />

Verbindungen wartet. An welche der lokalen IPv4-Adressen der Clientsocket<br />

schließlich geb<strong>und</strong>en wird, entscheidet sich erst beim tatsächlichen<br />

Verbindungsaufbau zwischen Client <strong>und</strong> Server.<br />

Anschließend wird der angelegte Socket sd <strong>mit</strong>tels bind() <strong>mit</strong> der eben gefüllten<br />

Socket-Adresse verknüpft. Im konkreten Fall ist dies die Portnummer 1037<br />

in Verbindung <strong>mit</strong> der IPv4-Wildcard-Adresse. Für den Fall, daß der Socket<br />

nicht geb<strong>und</strong>en werden kann, beendet sich das Programm umgehend <strong>mit</strong> einer<br />

entsprechenden Fehlermeldung.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5 #include <br />

6 #include <br />

7 #include <br />

8<br />

9 #define SRVPORT 1037<br />

10 #define BACKLOG 32<br />

11<br />

Beispiel 4.6. timeserver.c

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!