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.

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

Was ißt Sir Quickly am liebsten?<br />

Ihre Bedenkzeit ist abgelaufen.<br />

Connection closed.<br />

21–22<br />

Wenn wir uns aus Abschnitt 2.2.3 die Ausführungen zur Datenpufferung<br />

der ANSI/ISO C Standard-Bibliothek ins Gedächtnis rufen, ist die Frage<br />

nach dem seltsamen Verhalten des Quizprogramms schnell beantwortet. Anders<br />

als in den bisherigen Tests kommuniziert der Prozeß jetzt nicht mehr<br />

über das Terminal sondern über eine Netzwerkverbindung <strong>mit</strong> seinem Quiz-<br />

Kandidaten. In diesem Fall wird aber für den Datenstrom der Standard-<br />

Ausgabe die vollständige Pufferung angewandt. Die Quizfrage landet da<strong>mit</strong><br />

zuerst einmal nur in einem internen Datenpuffer des Quiz-Servers anstatt<br />

sofort über das Netzwerk übertragen zu werden. In der Ausgabe des Telnet-<br />

Programms erscheint deshalb zunächst keine Quizfrage. Erst am Programmende,<br />

d. h. vor allem erst nach der Bedenkzeit von 20 Sek<strong>und</strong>en, werden im<br />

Rahmen der exit()-Funktion alle Datenpuffer geleert <strong>und</strong> da<strong>mit</strong> auf einen<br />

Schlag an den Client übertragen <strong>und</strong> dort ausgegeben.<br />

Hat man das Problem erkannt, ist es auch schnell behoben. Über die Funktion<br />

setvbuf() stellen wir in Beispiel 4.1 für die beiden Datenströme stdin <strong>und</strong><br />

stdout einfach die zeilenweise Pufferung ein. Anschließend verhält sich die<br />

Ein- <strong>und</strong> Ausgabe des Programms wie gewünscht. Alternativ ließen sich die<br />

Datenpuffer <strong>mit</strong> der Funktion fflush() auch explizit leeren.<br />

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5 #include <br />

6 #include <br />

Beispiel 4.1. quiz3.c<br />

7<br />

8 void signal_handler( int sig )<br />

9 {<br />

10 printf( "Ihre Bedenkzeit ist abgelaufen.\n" );<br />

11 exit( EXIT_FAILURE );<br />

12 }<br />

13<br />

14 int main( int argc, char *argv[] )<br />

15 {<br />

16 char antwort[] = "Himbeerjoghurt";<br />

17 char eingabe[20];<br />

18 struct sigaction action , old_action;<br />

19 int i;<br />

20<br />

21 setvbuf( stdin , NULL, _IOLBF , 0 );

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!