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/socket.h>

int accept(int s, struct sockaddr *addr, size_t *addrlen);

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:

  1. accept() wählt aus der Warteschlange die erste Verbindungsanforderung aus.

  2. accept() erzeugt einen neuen Socket, der die gleichen Eigenschaften hat wie der Socket s.

  3. 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.

Siehe auch

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