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.

4.3 <strong>Sockets</strong> 193<br />

Mit der listen()-Funktion läßt sich ein <strong>mit</strong> socket() erstellter, aktiver<br />

Socket in einen passiven Socket umwandeln: Die Funktion erwartet als erstes<br />

Argument den Socketdeskriptor des in einen horchenden Socket umzuwandelnden<br />

<strong>Sockets</strong>. Ist der übergebene Socket noch nicht <strong>mit</strong> einer Socket-Adresse<br />

verknüpft, dann bindet listen() implizit eine Socket-Adresse an den noch<br />

nicht geb<strong>und</strong>enen Socket (vgl. dazu Abschnitt 4.3.4).<br />

Serverseitig ist es allerdings eher unüblich, auf diese implizite Bindung zurückzugreifen.<br />

Die Protokollspezifikationen der angebotenen Dienste sehen in der<br />

Regel vor, daß die Server auf den festgelegten well known Ports auf Anfragen<br />

warten. Die Clients versuchen ihrerseits, die Server über diese bekannten<br />

Ports zu erreichen. 20<br />

#include<br />

<br />

int listen( int socket , int backlog );<br />

Über den backlog-Parameter der listen-Funktion kann die Anwendung Einfluß<br />

darauf nehmen, wie lange die Warteschlange für den angegebenen Socket<br />

in etwa sein soll. Wie sich die übergebene Zahl konkret auf die tatsächliche<br />

Länge der Listen-Queue auswirkt, überläßt IEEE Std 1003.1-2001 der jeweiligen<br />

Implementierung. Der Standard legt lediglich fest, daß ein größerer Wert<br />

für backlog auch in einer längeren (oder mindestens gleich langen) Warteschlange<br />

resultieren soll. 21 Der größte Wert, den backlog annehmen kann,<br />

ist über die in vereinbarte Konstante SOMAXCONN ersichtlich.<br />

Überschreitet backlog die maximal mögliche Länge der Listen-Queue,<br />

so wird die tatsächliche Länge der Warteschlange auf den Maximalwert zurecht<br />

gestutzt.<br />

Sie sollten es dabei gr<strong>und</strong>sätzlich vermeiden, für backlog ein Wert kleiner oder<br />

gleich 0 zu übergeben. Ein solcher Wert kann von verschiedenen Implementierungen<br />

auf ganz unterschiedliche Art <strong>und</strong> Weise interpretiert werden. Sollen<br />

20 Eine interessante Ausnahme zu dieser Regel bilden die sogenannten Remote Procedure<br />

Calls (RPCs). Hier verwaltet ein eigener Server, der Endpoint Mapper, die<br />

lokalen Endpunkte der RPC-Server. Sämtliche lokalen RPC-Server registrieren<br />

dazu ihre implizit geb<strong>und</strong>enen <strong>Sockets</strong> bei diesem Dienst. Der Endpoint Mapper<br />

hat als einziger RPC-Server einen well known Port. Die RPC-Clients kontaktieren<br />

diesen festen Endpunkt des Endpoint Mappers <strong>und</strong> erfragen sich von ihm die<br />

Socket-Adresse des gewünschten RPC-Servers.<br />

21 Diese doch recht großen Freiheiten in der Implementierung haben dafür gesorgt,<br />

daß Anwendungsentwickler bei der Wahl einer vernünftigen Größe für backlog<br />

sehr schnell im Regen stehen. In Beispielprogrammen wird für backlog immer<br />

gerne die Zahl 5 eingesetzt, was wohl auf eine historische Obergrenze bei 4.2 BSD<br />

zurück geht. Interessanterweise finden sich deshalb, auch in meinem eigenen F<strong>und</strong>us,<br />

viele echte Anwendungen, die den Wert 5 offensichtlich immer noch für eine<br />

gute“ Wahl halten. Auch Abkupfern will also gelernt sein . . .<br />

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!