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.
Ausnahme: Ablauf BCAM-Conn-Timer:
Dieser Timer muss bei Nutzung des ISO-Transport-Service stärker beachtet werden, weil die Verbindungsaufbau-Quittung hier im Gegensatz zu AF_INET und AF_INET6 erst durch ein Senden, z.B. mit send(), erzeugt und an den Partner gesendet wird.Mit accept() nimmt der Server die Verbindung für den als „abhörend“ markierten Socket an. Mit den Funktionen getsockopt() oder recvmsg() lassen sich Verbindungsdaten auswerten, die zuvor bei der Verbindungsanforderung übertragen wurden. Im Gegensatz zur Internet-Domäne ist die Verbindung nach accept() noch nicht vollständig aufgebaut. Die Verbindung in Richtung Partner wird erst vollständig aufgebaut durch
Senden von Benutzerdaten oder
Senden von CFRM-Daten (confirm) mit der Funktion sendmsg().
Der folgende Programmausschnitt skizziert die Verbindungsannahme durch den Server in der Domäne AF_ISO:
struct sockaddr_iso from; ... .. listen(s, 5); fromlen = sizeof(from); newsock = accept(s, &from, &fromlen); send(newsock, msg, len, flags);
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. Wenn nach Ausführung von send() die Verbindung vollständig aufgebaut ist, können über den neu erzeugten Socket 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 Verbindungsanforderungen nur von einem oder mehreren bestimmten Partnern entgegennehmen 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 und
wie eine Server-Task verhindern kann, dass der Aufruf von accept() blockiert.