Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Verbindungsannahme durch den Server

&pagelevel(4)&pagelevel

Wenn der Server bereit ist, seine speziellen Services anzubieten, ordnet er einem seiner Sockets den für den betreffenden Service festgelegten Namen (Adresse) zu. Um die Verbindungsanforderung eines Clients annehmen zu können, muss der Server außerdem die beiden folgenden Schritte durchführen:

  1. Mit der Funktion listen() markiert der Server den Socket für eingehende Verbindungsanforderungen als "lauschend". Danach überwacht der Server den Socket, d.h. er wartet passiv auf eine Verbindungsanforderung für diesen Socket. Ein beliebiger Partner kann nun zum Server Kontakt aufnehmen.
    Durch listen() wird das POSIX-Subsystem außerdem veranlasst, an den betreffenden Socket gerichtete Verbindungsanforderungen in eine Warteschlange zu stellen. Auf diese Weise geht normalerweise keine Verbindungsanforderung verloren, während der Server eine andere Verbindungsanforderung bearbeitet.
  2. Mit accept() nimmt der Server die Verbindungsanforderung für den als "lauschend" markierten Socket an.

Nach der Verbindungsannahme mit accept() ist die Verbindung zwischen Client und Server aufgebaut und die Datenübertragung kann beginnen.

Der folgende Programmausschnitt skizziert die Verbindungsannahme durch den Server in der Internet-Domäne AF_INET:

struct sockaddr_in from;
int s, newsock;
...
listen(s, 5);
fromlen = sizeof (from);
newsock = accept(s, (struct sockaddr *)&from, &fromlen);

Der folgende Programmausschnitt skizziert die Verbindungsannahme durch den Server in der Internet-Domäne AF_INET6:

struct sockaddr_in6 from;
int s, newsock, fromlen;
...
listen(s, 5);
fromlen = sizeof(from);
newsock = accept(s, (struct sockaddr_in6 *)&from, &fromlen);

Als erster Parameter beim Aufruf von listen() wird der Deskriptor s des Sockets übergeben, über den die Verbindung aufgebaut werden soll. Der zweite Parameter gibt an, wie viele Verbindungsanforderungen maximal in der Warteschlange auf die Annahme durch den Server-Prozess warten können. Derzeit unterstützt das POSIX-Subsystem maximal 50 wartende Verbindungsanforderungen.

Als erster Parameter beim Aufruf von accept() wird der Deskriptor s des Sockets übergeben, über den die Verbindung aufgebaut werden soll. Nach Ausführung von accept() enthält der Parameter from die Adresse der Partneranwendung und fromlen enthält die Länge dieser Adresse. Bei der Annahme einer Verbindung mit accept() wird ein Deskriptor für einen neuen Socket erzeugt. Diesen Deskriptor liefert accept() als Ergebnis zurück. Über den neu erzeugten Socket können nun Daten ausgetauscht werden. Über den Socket s kann der Server weitere Verbindungen annehmen.

Ein Aufruf von accept() blockiert normalerweise, weil die Funktion accept() solange nicht zurückkehrt, bis eine Verbindung angenommen ist. Außerdem hat der Server-Prozess beim Aufruf von accept() keine Möglichkeit anzuzeigen, dass er Verbindungswünsche nur von einem oder mehreren bestimmten Partnern annehmen möchte. Deshalb muss der Server-Prozess darauf achten, woher die Verbindung kommt. Der Server-Prozess muss die Verbindung beenden, wenn er nicht mit einem bestimmten Client kommunizieren möchte.

In "Erweiterte Funktionen von SOCKETS(POSIX)" ist näher beschrieben,

  • wie ein Server-Prozess auf mehr als einem Socket Verbindungen annimmt,

  • wie ein Server-Prozess verhindert, dass der Aufruf von accept() blockiert.