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.

4.3 <strong>Sockets</strong> 225<br />

1 int socket;<br />

2 struct timeval timeout;<br />

3<br />

4 ...<br />

5<br />

6 /* Timeout auf zwei Minuten festlegen */<br />

7 timeout.tv_sec = 120;<br />

8 timeout.tv_usec = 0;<br />

9<br />

10 if( setsockopt( socket , SOL_SOCKET , SO_RCVTIMEO , &timeout ,<br />

11 sizeof( struct timeval ) ) < 0 )<br />

12 {<br />

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

14 strerror( errno ) );<br />

15 exit( EXIT_FAILURE );<br />

16 }<br />

6–11<br />

Im obigen Beispiel wird für den Socket socket ein Timeout-Intervall von<br />

zwei Minuten vereinbart. Dazu wird die zuvor passend initialisierte timeval-<br />

Struktur der setsockopt()-Funktion zusammen <strong>mit</strong> einer Größenangabe <strong>und</strong><br />

der Socket-Option SO_RCVTIMEO für den gewünschten Socket socket übergeben.<br />

Eine nachfolgend aufgerufene Empfangsfunktion (z. B. read()), wuürde<br />

dann maximal für das angegebene Intervall von zwei Minuten blockieren,<br />

wenn sie dabei über den Socket keine weiteren Daten mehr empfängt. Falls<br />

überhaupt keine Daten gelesen werden konnten, liefert die Funktion bei ihrer<br />

Rückkehr einen Fehler <strong>und</strong> setzt die Fehlervariable errno auf einen der<br />

beiden Werte EAGAIN oder EWOULDBLOCK. Wurden vor Ablauf des Timeouts<br />

von der Funktion noch Daten empfangen, so kehrt sie <strong>mit</strong> weniger Zeichen als<br />

ursprünglich angefordert zurück.<br />

Das Verhalten einer Sendefunktion (wie z. B. write()) bei zuvor aktiviertem<br />

Timeout-Intervall ist analog definiert.<br />

Die Socket-Option SO_REUSEADDR<br />

Die Socket-Option SO_REUSEADDR ist die wohl bekannteste <strong>und</strong> wichtigste<br />

Socket-Option <strong>und</strong> erlaubt unter bestimmten Bedingungen die Mehrfach- oder<br />

Wiederverwendung lokaler Socket-Adressen. Im Zusammenspiel <strong>mit</strong> TCPbasierten<br />

Servern dient die Option im Wesentlichen den folgenden beiden<br />

Zwecken:<br />

1. Die SO_REUSEADDR-Option erlaubt den Neustart eines Servers, selbst wenn<br />

die lokale Socket-Adresse noch in Gebrauch ist. Dies ist z. B. dann der Fall,<br />

wenn sich der Hauptprozeß eines nebenläufigen Servers bereits beendet<br />

hat, aber einer seiner Kindprozesse noch eine Clientanfrage bis zum Ende

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!