|
Beschreibung
Mit der Funktion accept() nimmt der Server-Prozess über einen Socket eine Verbindung an, die ein Client mit der Funktion connect() angefordert hat. accept() wird nur bei dem verbindungsorientierten Socket-Typ SOCK_STREAM verwendet.
Der Parameter s bezeichnet den Socket, der nach dem Aufruf von listen() auf eine Verbindungsanforderung wartet.
Bei Rückkehr von accept() zeigt addr auf die Adresse der Partneranwendung, wie sie auf der Kommunikationsebene bekannt ist. Das exakte Format von *addr (d.h. der Adresse) wird durch die Domäne bestimmt, in der die Kommunikation stattfindet.
Der Abschnitt "Socket-Adressierung" beschreibt, wie Sie dem Socket eine Adresse zuordnen.
addrlen zeigt auf ein size_t-Objekt, das zum Zeitpunkt des Aufrufs von accept() die Größe des von addr referenzierten Speicherbereichs enthält. Bei Rückkehr der Funktion accept() enthält dieses size_t-Objekt (d.h. *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:
accept() wählt aus der Warteschlange die erste Verbindungsanforderung aus.
accept() erzeugt einen neuen Socket, der die gleichen Eigenschaften hat wie der Socket s.
accept() liefert als Ergebnis den Descriptor für den neuen Socket. Wenn der Socket s nicht-blockierend ist, ist auch der neue Socket nicht-blockierend (siehe "fcntl() - Sockets steuern").
Stehen in der Warteschlange keine Verbindungsanforderungen an, sind zwei Fälle zu unterscheiden:
Wenn der Socket nicht als nicht-blockierend markiert ist, blockiert accept() den aufrufenden Prozess solange, bis eine Verbindungsanforderung eintrifft.
Wenn der Socket als nicht-blockierend markiert ist, liefert accept() den Fehler EWOULDBLOCK.
Um sicher zu gehen, dass der accept()-Aufruf nicht blockieren wird, kann der Benutzer vor dem Aufruf von accept() zunächst mit select() oder poll() die Lesebereitschaft des betreffenden Sockets prüfen.
Wenn accept() für den Socket s eine Verbindung akzeptiert hat, können über den mit accept() neu erzeugten Socket Daten ausgetauscht werden mit dem Socket, 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 Verbindungsanforderungen 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.
Fehler
EBADF
s ist kein gültiger Deskriptor.
EFAULT
addr zeigt nicht auf den beschreibbaren Teil des Benutzer-Adressbereichs.
EINTR
Die Funktion accept() wurde durch ein Signal unterbrochen, das vor Eingang einer Verbindungsanforderung empfangen wurde.
EINVAL
Der Socket akzeptiert keine Verbindungsanforderungen.
EMFILE
Im aufrufenden Prozess sind zurzeit OPEN_MAX Dateideskriptoren geöffnet.
ENETDOWN
Die Verbindung zum Netzwerk ist nicht mehr aktiv.
ENOBUFS
Es ist kein Pufferplatz verfügbar.
ENOTSOCK
Der Deskriptor verweist nicht auf einen Socket.
EOPNOTSUPP
Der referenzierte Socket ist nicht vom Typ SOCK_STREAM.
EPROTO
Es ist ein Protokollfehler aufgetreten.
EWOULDBLOCK
Der Socket ist als nicht-blockierend gekennzeichnet, und es stehen keine Verbindungsanforderungen aus.