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.

5.3 Nebenläufige Server <strong>mit</strong> mehreren <strong>Threads</strong> 269<br />

Beispiel 5.13. thread-srv.c, Teil 2<br />

33 void *worker( void *arg )<br />

34 {<br />

35 int client = (int)arg; /* Socketdeskriptor er<strong>mit</strong>teln */<br />

36<br />

37 /* Clientverbindung behandeln */<br />

38 handle_client( client );<br />

39<br />

40 /* Socketdeskriptor schließen <strong>und</strong> Thread beenden */<br />

41 close( client );<br />

42 return( NULL );<br />

43 }<br />

44<br />

45 void *accept_handler( void *arg )<br />

46 {<br />

47 int sd = (int)arg; /* passiven Socket er<strong>mit</strong>teln */<br />

48 socklen_t slen;<br />

49 struct sockaddr_storage sa;<br />

50 pthread_t tid;<br />

51 int client , status;<br />

52<br />

53 /*<br />

54 * In einer Endlosschleife verarbeitet der Server die<br />

55 * eingehenden Clientverbindungen. Da es sich um ein<br />

56 * Beispiel für einen nebenläufigen Server <strong>mit</strong> <strong>Threads</strong><br />

57 * handelt , wird für jede Clientverbindung ein neuer<br />

58 * Thread erzeugt.<br />

59 */<br />

60<br />

61 for(;;)<br />

62 {<br />

63 slen = sizeof( sa );<br />

64<br />

65 /* Neue Socketverbindung annehmen */<br />

66 if( ( client = accept( sd, (struct sockaddr *)&sa,<br />

67 &slen ) ) < 0 )<br />

68 {<br />

69 /* Fehler protokollieren */<br />

70 syslog( LOG_ERR , "accept() failed: %s",<br />

71 strerror( errno ) );<br />

72<br />

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

74 continue;<br />

75 }<br />

76<br />

77 /* Neuen Thread zur Behandlun der Verbindung starten */<br />

78 status = pthread_create( &tid, NULL, worker ,<br />

79 (void *)client ); /* Socketdeskriptor als Argument */

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!