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.

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

abarbeitet. In diesem Fall kann der Server im Normalfall nicht erfolgreich<br />

neu gestartet werden, da der horchende Socket nicht <strong>mit</strong>tels bind() an<br />

die gewohnte lokale Socket-Adresse geb<strong>und</strong>en werden kann, bevor der verbliebene<br />

Client seine Verbindung zum Client geschlossen hat. Die Socket-<br />

Adresse ist zuvor ja noch Teil einer existierenden Netzwerkverbindung.<br />

Gleiches gilt übrigens für einen Serversocket, dessen TCP-Verbindung,<br />

die sich gerade im Verbindungsabbau befindet (Status FIN_WAIT_2 oder<br />

TIME_WAIT, vgl. dazu Abschnitt 4.3.7): Auch hier schlägt das Binden der<br />

lokalen Socket-Adresse in einer neuen Serverinstanz fehl, sofern dort die<br />

Socket-Option SO_REUSEADDR nicht gesetzt ist. Aus diesem Gr<strong>und</strong> empfiehlt<br />

es sich für alle TCP/IP-Server, die SO_REUSEADDR-Option zu setzen.<br />

2. Mit Hilfe der Socket-Option SO_REUSEADDR können mehrere Serverinstanzen<br />

am selben Port hören, sofern sie dabei verschiedene lokale IP-Adressen<br />

binden. Ein typisches Beispiel hierfür sind moderne Webserver, die für die<br />

verschiedenen lokale IP-Adressen des <strong>Unix</strong>-Systems sogenannte virtuelle<br />

Hosts bilden können. Der Server bindet sich dazu zunächst <strong>mit</strong> der<br />

Wildcard-Adresse an den Serverport. Danach bindet er für jeden virtuellen<br />

Host je einen weiteren Socket <strong>mit</strong> der hostspezifischen IP-Adresse<br />

an den Serverport. Treffen nun neue Verbindungsanfragen auf dem Serverport<br />

ein, so wird von TCP/IP immer der am besten passende passive<br />

Socket für die neue Verbindung ausgewählt. Existiert kein virtueller Host<br />

für die Ziel-IP-Adresse der Verbindungsanfrage, so wird die Anfrage dem<br />

Socket <strong>mit</strong> der Wildcard-Adresse übergeben.<br />

Das nachfolgende Programmfragment zeigt, wie die SO_REUSEADDR-Option für<br />

den Socket socket aktiviert wird:<br />

1 int socket , reuse = 1;<br />

2<br />

3 ...<br />

4<br />

5 if( setsockopt( socket , SOL_SOCKET , SO_REUSEADDR , &reuse ,<br />

6 sizeof( int ) ) < 0 )<br />

7 {<br />

8 printf( "Fehler in setsockopt(): %s\n",<br />

9 strerror( errno ) );<br />

10 exit( EXIT_FAILURE );<br />

11 }<br />

5–6<br />

Die zur Socket-Option SO_REUSEADDR assoziierte Datenstruktur ist ein simpler<br />

Integer-Wert (vgl. dazu Tabelle 4.7). Um die Option zu aktivieren, wird im<br />

vorausgehenden Beispiel die Variable reuse auf den Wert 1 gesetzt <strong>und</strong> per<br />

Referenz an die setsockopt()-Funktion übergeben. Setzt man reuse stattdessen<br />

vor dem Aufruf auf 0, wird die Socket-Option für den betreffenden<br />

Socket deaktiviert.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!