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.

242 5 Netzwerkprogrammierung in der Praxis<br />

43<br />

44 /* Im Fehlerfall: Socket schließen ... */<br />

45 close( sd );<br />

46 }<br />

47<br />

48 /* Ergebnisliste wieder freigeben */<br />

49 freeaddrinfo( ai );<br />

50<br />

51 /*<br />

52 * Wurde die Liste der Adreßstrukturen erfolglos<br />

53 * verarbeitet , gilt aptr == NULL <strong>und</strong> errno zeigt den<br />

54 * Fehler des letzten Aufrufs von socket(), bind() oder<br />

55 * listen() an.<br />

56 */<br />

57<br />

58 if( aptr == NULL )<br />

59 {<br />

60 fprintf( stderr , "Can’t listen on port %s: %s\n",<br />

61 servname , strerror( errno ) );<br />

62 return( -1 );<br />

63 }<br />

64 }<br />

65 else<br />

66 {<br />

67 fprintf( stderr , "getaddrinfo() failed: %s\n",<br />

68 gai_strerror( status ) );<br />

69 return( -1 );<br />

70 }<br />

71<br />

72 return( sd );<br />

73 }<br />

48–49<br />

51–63<br />

65–70<br />

Sobald die Schleife abgearbeitet ist, egal ob erfolgreich oder erfolglos, kann die<br />

von getaddrinfo() gelieferte Liste der Adreßstrukturen wieder freigegeben<br />

werden. Die darin gespeicherten Informationen werden von tcp_listen() ab<br />

jetzt nicht mehr benötigt.<br />

Hat nach dem Austritt aus der Schleife der Hilfszeiger aptr den Wert NULL,<br />

so wurde die Liste der addrinfo-Strukturen erfolglos abgearbeitet. Das heißt,<br />

daß die Liste keinen Datensatz enthalten hat, <strong>mit</strong> dessen Hilfe ein passiver<br />

Socket erstellt werden konnte. Dies kann durchaus der Fall sein, z. B. wenn<br />

der spezifizierte Port auf dem System schon an einen anderen Socket geb<strong>und</strong>en<br />

<strong>und</strong> da<strong>mit</strong> bereits belegt ist. In diesem Fall gibt tcp_listen() neben einer<br />

Fehlermeldung den Wert -1 zurück.<br />

Sollte der Aufruf der getaddrinfo()-Funktion (siehe oben) fehlgeschlagen<br />

sein, so wird ebenfalls eine Fehlermeldung ausgegeben <strong>und</strong> -1 zurückgeliefert.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!