accept(3N) accept(3N)
NAME
accept - Verbindung auf einem Socket annehmen
SYNTAX
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, int *addrlen);
BESCHREIBUNG
Das Argument s bezeichnet einen Socket, der mit socket(3N) erzeugt,
mit bind(3N) an eine Adresse gebunden wurde und nach einem Aufruf von
listen(3N) Verbindungswünsche entgegennimmt. accept() nimmt den ersten
Verbindungswunsch aus der Schlange der noch nicht bearbeiteten Verbin-
dungswünsch heraus, erzeugt einen neuen Socket mit den Attributen von
s und legt einen neuen Dateideskriptor für den Socket an. Falls keine
unbearbeiteten Verbindungswünsche in der Schlange sind und der Socket
nicht als "nicht-blockierend" gekennzeichnet ist, blockiert accept()
den aufrufenden Prozeß, bis eine Verbindung vorhanden ist. Wenn der
Socket als "nicht-blockierend" markiert ist und keine unbearbeiteten
Verbindungswünsche in der Schlange stehen, liefert accept() einen Feh-
ler zurück. Dies wird weiter unten noch genauer beschrieben.
accept() stellt mit Hilfe der Datei netconfig(4) den STREAMS-Geräte-
dateinamen fest, der mit s verbunden ist. Dies ist das Gerät, auf dem
der Verbindungswunsch angenommen wird. Der von accept() neu erzeugte
Socket dient dem Datenaustausch. Über ihn können keine weiteren Ver-
bindungen angenommen werden. Der ursprüngliche Socket (s) bleibt für
die Annahme weiterer Verbindungen geöffnet.
Das Argument addr ist ein Ergebnisparameter, der die Adresse des Part-
ners enthält. Das genaue Format des Parameters addr wird durch die
Adreßfamilie festgelegt, zu der der Socket gehört.
addrlen ist ein Parameter, der einen Ergebniswert enthält. Anfangs
enthält er die Größe des Speichers, auf den addr zeigt. Bei der Rück-
kehr enthält er die Länge der zurückgelieferten Adresse in Bytes.
accept() wird mit verbindungsorientierten Socket-Typen (SOCKSTREAM)
verwendet.
Man kann auch mit select(3C) feststellen, ob am Socket ein Verbin-
dungswunsch ansteht, und danach einen accept()-Aufruf durchführen.
Beim select(3C)-Aufruf muß der Socket auf "Lesen" hin überprüft wer-
den. Wird ein "Lese"-Ereignis angezeigt, so bedeutet dies, daß ein
Verbindungswunsch ansteht. Der Verbindungswunsch kann dann mit
accept() angenommen werden.
RÜCKGABEWERT
accept() liefert bei einem Fehler -1 zurück. Im Erfolgsfall liefert es
eine nicht-negative Ganzzahl zurück, die der Deskriptor für den akzep-
tierten Socket ist.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
accept(3N) accept(3N)
DIAGNOSE
accept() schlägt in folgenden Fällen fehl:
EBADF Der Deskriptor ist ungültig.
ENOTSOCK Der Deskriptor verweist nicht auf einen Socket.
EOPNOTSUPP Der Socket, auf den verwiesen wird, ist nicht vom Typ
SOCKSTREAM.
EWOULDBLOCK Der Socket ist als nichtblockierend markiert und es
sind keine anzunehmenden Verbindungen vorhanden.
EPROTO Es ist ein Protokollfehler aufgetreten, z. B. wenn der
STREAMS-Protokollstack nicht initialisiert wurde.
ENODEV Die Protokollfamilie und der Typ, der s entspricht,
konnte in der Datei netconfig nicht gefunden werden.
ENOMEM Es war nicht genügend Speicher verfügbar, um die Ope-
ration durchzuführen.
ENOSR Es waren nicht genügend STREAMS-Betriebsmittel verfüg-
bar, um die Operation durchzuführen.
SIEHE AUCH
select(3C), bind(3N), connect(3N), listen(3N), socket(3N),
netconfig(4).
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98