ACCEPT(2)

BEZEICHNUNG
accept - nimmt eine Verbindung auf einem Socket an

BEZEICHNUNG
#include <sys/types.h>

#include <sys/socket.h>

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

BESCHREIBUNG
Der Parameter s ist ein Socket, der mit socket(2), erzeugt wurde, mit bind(2) an eine Adresse gebunden wird und mit listen(2) auf Verbindungen wartet. Die Funktion accept extrahiert den ersten Verbindungswunsch aus der Warteschlange der ankommenden Verbindungen, erzeugt einen neuen Socket mit den gleichen Eigenschaften von s und alloziiert einen neue Deskriptor für den Socket. Wenn keine wartende Verbindung vorhanden ist und der Socket nicht als nicht-blockierend markiert ist, blockiert accept den aufrufenden Prozeß bis eine Verbindung vorhanden ist. Wenn der Socket als nicht-blockierend markiert ist und keine wartenden Verbindungen vorhanden sind, gibt accept eine Fehlermeldung, wie sie unten beschrieben ist, zurück. Der akzeptierte Socket kann nicht mehr für weitere Verbindungen benutzt werden. Der Originalsocket s bleibt offen. Das Argument addr ist ein Rückgabeparameter, das mit der Adresse der verbindenden Einheit gefüllt wird, wie sei der Kommunikationsschicht bekannt ist. Das exakte Format des addr Parameters wird von der Domain festgelegt, in der die Kommunikation stattfindet. Die Variable addrlen ist ein Rückgabeparameter, sie sollte anfangs die Anzahl Bytes enthalten auf die addr zeigt; bei der Rückgabe enthält es die aktuelle Länge der Adresse (in Bytes). Dieser Aufruf wird bei verbindungsbasierten Sockettypen benutzt, momentan in Verbindung mit SOCK_STREAM. Es ist möglich, einen Socket mit select(2) aufzumachen, um ihn mit einem accept zum Lesen zu benutzen. Bei bestimmten Protokollen, die explizite Bestätigung verlangen, wie ISO oder DATAKIT, kann davon ausgegangen werden, daß accept nur die nächste Verbindung aus der Warteschlange holt ohne sie automatisch zu bestätigen. Die Bestätigung kann ein normaler Lese- oder Schreibvorgang auf dem neuen Deskriptor mit sich bringen, eine Ablehung kann impliziert werden durch ein Schließen des neuen Sockets. Man kann die Daten einer Verbindungsanforderung ohne Bestätigung erhalten, indem man einen recvmsg(2) Aufruf absetzt mit einer auf null gesetzten msg_iovlen un einem msg_controllen ungleich null oder durch Aufruf von getsockopt(2). Analog dazu kann man die Ablehnung einer Benutzerverbindung erzeugen, indem man sendmsg(2) nur mit den Kontrollinformationen aufruft oder durch setsockopt(2).

RUECKGABEWERTE
Die Funktion gibt bei Fehlern -1 zurück. Wenn der Aufruf erfolgreich war, gibt sie einen positiven Integerwert zurück, der der Deskriptor für den aktzeptierten Socket ist.

FEHLER

EBADF
    Der Deskriptor ist ungültig.

ENOTSOCK
    Der Deskriptor referenziert eine Datei und keinen Socket.

EOPNOTSUPP
    Der referenzierte Socket ist nicht vom Typ SOCK_STREAM.

EFAULT
    Der Parameter addr ist kein beschreibbarer Teil des Adreßraums des Prozesses.

EWOULDBLOCK
    Der Socket ist als nicht-blockierend markiert, aber es sind keine zu akzeptierenden Verbindungen vorhanden.

GESCHICHTE
Die Funktion accept erschien in BSD 4.2.

SIEHE AUCH
bind(2), connect(2), listen(2), select(2), socket(2).