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.

270 5 Netzwerkprogrammierung in der Praxis<br />

80 if( status != 0 )<br />

81 {<br />

82 syslog( LOG_ERR , "pthread_create() failed: %s\n",<br />

83 strerror( status ) );<br />

84 close( client );<br />

85<br />

86 /* Trotz Fehler brechen wir nicht ab! */<br />

87 continue;<br />

88 }<br />

89 pthread_detach( tid );<br />

90 }<br />

91<br />

92 return; /* Dummy, ... wird nie erreicht */<br />

93 }<br />

77–90<br />

Nachdem der nebenläufige Server jede Clientverbindung in einem eigenen<br />

Thread behandeln soll, wird für jede erfolgreich angenommene Netzwerkverbindung<br />

ein neuer Thread gestartet. Der Startfunktion worker() wird als<br />

einziges Argument der Socketdeskriptor der neuen Verbindung übergeben.<br />

Danach wird der neue Thread entkoppelt <strong>und</strong> der Accept-Handler kümmert<br />

sich um die nächste eingehende TCP-Verbindung.<br />

5.3.3 Das Hauptprogramm als Signalverarbeiter<br />

95–103<br />

105–117<br />

Wie in Beispiel 5.14 zu sehen, öffnet auch der threadbasierte Server als erstes<br />

einen passiven Socket, um neue TCP-Verbindungen annehmen zu können.<br />

Anders als der iterative Server aus Beispiel 5.9, setzt der nebenläufige Server<br />

keine Signalbehandlungsroutine für das SIGTERM-Signal. Stattdessen blockiert<br />

der Hauptthread dieses Signal für den gesamten Prozeß. Die für den Hauptthread<br />

installierte Signalmaske wird im Anschluß über daemon_init() an<br />

den in den Hintergr<strong>und</strong> verlagerten Serverprozeß <strong>und</strong> später dann an die von<br />

diesem gestarteten <strong>Threads</strong> vererbt.<br />

Beispiel 5.14. thread-srv.c, Teil 3<br />

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

96 {<br />

97 int sd, status;<br />

98 sigset_t sigset;<br />

99 pthread_t tid;<br />

100<br />

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

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

103 exit( EXIT_FAILURE );

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!