Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

accept() - Eine Verbindung über einen Socket annehmen

&pagelevel(4)&pagelevel



#include <sys.types.h>
#include <sys.socket.h>
 

#include <netinet.in.h> /* nur bei AF_INET und AF_INET6 */
#include <iso.h>        /* nur bei AF_ISO */
   
Kernighan-Ritchie-C:
int accept(s, addr, addrlen);

int s;
int *addrlen;

struct sockaddr_in *addr;  /* nur bei AF_INET  */
struct sockaddr_in6 *addr; /* nur bei AF_INET6 */
struct sockaddr_iso *addr; /* nur bei AF_ISO   */

ANSI-C:
int accept(int s, struct sockaddr * addr, int* addrlen);


Beschreibung

Mit der Funktion accept() nimmt die Server-Task über den Socket s eine Verbindung an, die von einem Client mit der Funktion connect() angefordert wurde.

Damit accept() für den Socket s aufgerufen werden kann, müssen folgende Voraussetzungen erfüllt sein:

  • s muss ein Stream-Socket sein (SOCK_STREAM), dem mit bind() ein Name (Adresse) zugeordnet wurde.

  • s muss mit listen() als „abhörend“ markiert, d.h. für die Annahme von Verbindungsanforderungen zugelassen sein.

addr zeigt bei Rückkehr von accept() auf die Adresse der Partneranwendung, wie sie auf der Kommunikationsebene bekannt ist. Das exakte Format der zurückgelieferten Adresse wird durch die Domäne bestimmt, in der die Kommunikation stattfindet:

addrlen zeigt auf ein Integer-Objekt, das zum Zeitpunkt des Aufrufs von accept() die Länge von *addr (in Bytes) enthalten muss. Bei Rückkehr der Funktion accept() enthält *addrlen die Länge (in Bytes) der zurückgelieferten Adresse.

Wenn in der durch die Funktion listen() eingerichteten Warteschlange mindestens eine Verbindungsanforderung vorliegt, verfährt accept() wie folgt:

  1. accept() wählt aus der Warteschlange der anstehenden Verbindungsanforderungen die erste Verbindung aus.

  2. accept() erzeugt einen neuen Socket.

  3. accept() liefert als Ergebnis den Deskriptor für den neuen Socket.

Stehen in der Warteschlange keine Verbindungsanforderungen an, so sind zwei Fälle zu unterscheiden:

  • Wenn der Socket als blockierend (Standardfall) markiert ist, blockiert accept() die aufrufende Task solange, bis eine Verbindung möglich ist.

  • Wenn der Socket als nicht-blockierend markiert ist, liefert accept() eine Fehlermeldung mit errno = EWOULDBLOCK.

Um sicher zu gehen, dass der accept()-Aufruf nicht blockieren wird, können Sie vor dem Aufruf von accept() zunächst mit select() die Lesebereitschaft des betreffenden Sockets prüfen.

Nach erfolgreicher Ausführung von accept() ist in den Adressfamilien AF_INET und AF_INET6 die Verbindung bereits vollständig aufgebaut. In der Adressfamilie AF_ISO ist für den vollständigen Verbindungsaufbau zusätzlich einer der beiden folgenden Schritte erforderlich (siehe auch Bild 4 im Abschnitt "Zusammenspiel der Funktionen bei verbindungsorientierter Kommunikation"):

Nach erfolgreichem Verbindungsaufbau können über den mit  accept() neu erzeugten Socket Daten mit dem Socket ausgetauscht werden, der die Verbindung angefordert hat. Weitere Verbindungen können über den neu erzeugten Socket nicht hergestellt werden. Der ursprüngliche Socket s bleibt geöffnet, um weitere Verbindungen anzunehmen.

Returnwert

>= 0:

bei Erfolg. Der Wert ist der Deskriptor für den akzeptierten Socket.

-1:

bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.

Fehleranzeige durch errno

EBADF

s ist kein gültiger Deskriptor.

EFAULT

Die Länge des Bereichs für die Aufnahme der Adresse ist zu klein.

EMFILE

Die maximale Anzahl offener Sockets ist erreicht.

ENETDOWN

Die Verbindung zum Netzwerk ist nicht mehr aktiv.

EOPNOTSUPP

Der referenzierte Socket ist nicht vom Typ SOCK_STREAM, oder der referenzierte Socket ist nicht mit listen() als „abhörend“ markiert worden. 

EWOULDBLOCK

Der Socket ist als nicht-blockierend gekennzeichnet, und es stehen keine Verbindungsanforderungen an.

Siehe auch

bind(), connect(), listen(), select(), socket()