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> 221<br />

1–4<br />

6–7<br />

9–12<br />

14–16<br />

Rückkehr aus den Funktionen interpretiert werden können. Für diese Aufgaben<br />

stellt uns der POSIX-Standard glücklicherweise einen Satz nützlicher<br />

Makros zur Verfügung: FD_ZERO() leert die übergebene Deskriptormenge,<br />

FD_SET() nimmt einen Socketdeskriptor in die übergebene Deskriptormenge<br />

auf, FD_CLR() entfernt einen Socketdeskriptor aus der angegebenen Menge<br />

<strong>und</strong> der Rückgabewert von FD_ISSET() zeigt an, ob der angegebene Deskriptor<br />

in der Deskriptormenge enthalten ist.<br />

Beispiel 4.10 zeigt die Anwendung der select()-Funktion. Die Beispielfunktion<br />

select_input() skizziert die Socketbehandlung eines <strong>SSL</strong>-fähigen Webservers,<br />

der gleichzeitig die beiden Ports 80 <strong>und</strong> 443 bedienen soll. Die Funktion<br />

erwartet dazu beim Aufruf die beiden Deskriptoren http <strong>und</strong> hhtps der beiden<br />

passiven Serversockets.<br />

Als erstes werden in der Funktion die Datenstrukturen read <strong>und</strong> timeout für<br />

die Deskriptormenge <strong>und</strong> das maximal zu wartende Zeitintervall vereinbart.<br />

Anschließend wird die für den select()-Aufruf benötigte Deskriptormenge<br />

aufgebaut. Die Menge wird zunächst <strong>mit</strong>tels FD_ZERO() <strong>mit</strong> der leeren Menge<br />

initialisiert, danach werden <strong>mit</strong> FD_SET() nacheinander die beiden Socketdeskriptoren<br />

für normale <strong>und</strong> <strong>SSL</strong>-verschlüsselte Netzwerkverbindungen in die<br />

Menge aufgenommen. Den höchsten Socketdeskriptor nfds bestimmen wir,<br />

da es sich lediglich um zwei Deskriptoren handeltm, direkt beim Aufruf der<br />

select()-Funktion. Sollten viele Datei- oder Socketdeskriptoren in die Deskriptormengen<br />

einfließen, so wird der höchste Deskriptor meist <strong>mit</strong> Hilfe<br />

einer Schleife bestimmt.<br />

Bevor select() gestartet werden kann, muß noch der gewünschte Timeout<br />

vorbereitet werden: Wir setzen die maximale Wartezeit auf 120 Sek<strong>und</strong>en.<br />

1 #include <br />

2 #include <br />

Beispiel 4.10. select.c<br />

3<br />

4 int select_input( int http, int https )<br />

5 {<br />

6 fd_set read;<br />

7 struct timeval timeout;<br />

8<br />

9 /* Deskriptormenge für die beiden <strong>Sockets</strong> vorbereiten */<br />

10 FD_ZERO( &read );<br />

11 FD_SET( http, &read );<br />

12 FD_SET( https, &read );<br />

13<br />

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

15 timeout.tv_sec = 120;<br />

16 timeout.tv_usec = 0;<br />

17

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!