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.

286 5 Netzwerkprogrammierung in der Praxis<br />

85–88<br />

deskriptor sd geschlossen. Im Anschluß wird die aus Beispiel 5.10 bekannte<br />

handle_client()-Funktion aufgerufen, die ihrerseits die Anfrage des neuen<br />

Clients entgegennimmt <strong>und</strong> beantwortet. Abschließend wird der Socket zum<br />

Client geschlossen <strong>und</strong> die Serverinstanz beendet sich durch einen Aufruf der<br />

exit()-Funktion.<br />

Die letzte Anweisung der accept()-Schleife wird nur noch vom Elternprozeß<br />

erreicht, der als letztes noch die zuvor geöffnete <strong>und</strong> nun im Kindprozeß<br />

abgearbeitete Verbindung zum Client schließen muß, bevor es für den Server<br />

danach in den nächsten Schleifendurchlauf geht.<br />

5.5.3 Das Hauptprogramm<br />

90–118<br />

Im Hauptprogramm des Servers (siehe Beispiel 5.19) wird zunächst ein passiver<br />

Serversocket geöffnet <strong>und</strong> im Anschluß die sig_handler()-Funktion<br />

als Signalbehandlungsroutine für sowohl das SIGTERM-Signal als auch das<br />

SIGCHLD-Signal installiert.<br />

Beispiel 5.19. fork-srv.c, Teil 3<br />

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

91 {<br />

92 int sd;<br />

93 struct sigaction action;<br />

94<br />

95 /* horchenden Socket öffnen (passive open) */<br />

96 if( ( sd = tcp_listen( NULL, SRVPORT , BACKLOG ) ) < 0 )<br />

97 exit( EXIT_FAILURE );<br />

98<br />

99 /* Signalbehandlung für SIGTERM u. SIGCHLD installieren */<br />

100 action.sa_handler = sig_handler;<br />

101 sigemptyset( &action.sa_mask );<br />

102 action.sa_flags = 0;<br />

103<br />

104 if( sigaction( SIGTERM , &action , NULL ) < 0 )<br />

105 {<br />

106 fprintf( stderr , "sigaction(SIGTERM) failed: %s",<br />

107 strerror( errno ) );<br />

108 close( sd ); /* passiven Socket schließen */<br />

109 exit( EXIT_FAILURE );<br />

110 }<br />

111<br />

112 if( sigaction( SIGCHLD , &action , NULL ) < 0 )<br />

113 {<br />

114 fprintf( stderr , "sigaction(SIGCHLD) failed: %s",<br />

115 strerror( errno ) );<br />

116 close( sd ); /* passiven Socket schließen */

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!