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.

256 5 Netzwerkprogrammierung in der Praxis<br />

accept(s)<br />

Serverprozeß<br />

read(c)/write(c)<br />

close(c)<br />

Abb. 5.2. Ablaufdiagramm eines iterativen Servers<br />

5.2.1 Sequentielle Verarbeitung der Anfragen<br />

12–18<br />

20–29<br />

31–45<br />

Um den Server später durch ein SIGTERM-Signal geordnet beenden zu können,<br />

wird als erstes die Signalbehandlungsroutine sig_handler() implementiert.<br />

Die Funktion kommt zum Zug, sobald dem Dæmon ein SIGTERM-Signal zugestellt<br />

wird. Die sig_handler()-Funktion unternimmt nichts weiter, als die<br />

globale Variable daemon_exit auf den Wert 1 zu setzen, sodaß das Hauptprogramm<br />

im Anschluß erkennt, daß sich der Dæmon beenden soll (siehe unten).<br />

Im Hauptprogramm wird zunächst <strong>mit</strong>tels tcp_listen() ein passiver Socket<br />

auf dem in "server.h" festgelegten Port geöffnet. Nachdem der Hilfsfunktion<br />

im Argument nodename ein Nullzeiger übergeben wird, wird der neue Socket<br />

an die Wildcard-Adresse geb<strong>und</strong>en. Der neue Socket hört da<strong>mit</strong> auf allen<br />

konfigurierten IP-Adressen.<br />

Danach wird die sig_handler()-Funktion als Signalbehandlungsroutine für<br />

das SIGTERM-Signal festgelegt <strong>und</strong> der Prozeß in einen Dæmon umgewandelt.<br />

Die passende Hilfsfunktion daemon_init() haben wir in Abschnitt 2.6<br />

entwickelt. Sie stellt die Signalbehandlung für terminalgenerierte Signale auf<br />

ignorieren, legt den Server in den Hintergr<strong>und</strong>, löst die Assoziation zwischen<br />

Prozeß <strong>und</strong> kontrollierendem Terminal, schließt unbenötigte Dateideskriptoren,<br />

öffnet den Syslog-Dienst, wechselt das Arbeitsverzeichnis, ändert die Dateimodusmaske<br />

<strong>und</strong> legt zuguterletzt eine PID-Datei für den Dæmon an.<br />

Bis einschließlich der Dæmon-Initialisierung führen Fehler immer zu einer<br />

Fehlermeldung <strong>mit</strong> sofortigem Programmabbruch. Im weiteren Verlauf des<br />

Programms, sobald der Dienst also läuft, muß <strong>mit</strong> Fehlersituationen diffiziler<br />

umgegangen werden. Eine Fehlersituation, etwa ein Kommunikationsfehler<br />

zwischen dem Server <strong>und</strong> einem (einzigen) Client soll ja im Allgemeinen nicht<br />

mehr gleich zum Abbruch des kompletten Servers führen.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!