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:
Mit der Funktion listen() markiert der Server den Socket für eingehende Verbindungsanforderungen als „abhörend“. Danach hört der Server den Socket ab, d.h. er wartet passiv auf eine Verbindungsanforderung für diesen Socket. Ein beliebiger Partner kann nun zum Server Kontakt aufnehmen.
listen() veranlasst SOCKETS(BS2000) außerdem, die an den betreffenden Socket gerichteten Verbindungsanforderungen in eine Warteschlage zu stellen. Auf diese Weise geht normalerweise keine Verbindungsanforderung verloren, während der Server eine andere Verbindungsanforderung bearbeitet.
Mit accept() nimmt der Server die Verbindung für den als „abhörend“ 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, fromlen, newsock; ... listen(s, 5); fromlen = sizeof(from); newsock = accept(s, &from, &fromlen);
Der folgende Programmausschnitt skizziert die Verbindungsannahme durch den Server in der Internet-Domäne AF_INET6:
struct sockaddr_in6 from; int s, fromlen, newsock; ... listen(s, 5); fromlen = sizeof(from); newsock = accept(s, &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 die Server-Task warten können. Allerdings wertet SOCKETS(BS2000) diesen Parameter derzeit nicht aus, sondern nimmt Verbindungsanforderungen solange an, bis die maximale Anzahl verfügbarer Sockets belegt ist.
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 accept() solange nicht zurückkehrt, bis eine Verbindung angenommen ist. Außerdem hat die Server-Task beim Aufruf von accept() keine Möglichkeit, anzuzeigen, dass sie Verbindungswünsche nur von einem oder mehreren bestimmten Partnern annehmen möchte. Deshalb muss die Server-Task darauf achten, woher die Verbindung kommt. Die Server-Task muss die Verbindung beenden, wenn sie nicht mit einem bestimmten Client kommunizieren möchte.
Im Kapitel „Erweiterte Funktionen von SOCKETS(BS2000)“ ist näher beschrieben,
wie eine Server-Task auf mehr als einem Socket Verbindungen annehmen kann,
wie eine Server-Task verhindern kann, dass der Aufruf von accept() blockiert.