Provided by: manpages-de-dev_2.16-1_all bug

BEZEICHNUNG

       accept, accept4 – nimmt eine Verbindung auf einem Socket an

ÜBERSICHT

       #include <sys/types.h>          /* Siehe ANMERKUNGEN */
       #include <sys/socket.h>

       int accept(int sockfd, struct sockaddr *adresse, socklen_t *adresslaenge);

       #define _GNU_SOURCE             /* siehe feature_test_macros(7) */
       #include <sys/socket.h>

       int accept4(int sockfd, struct sockaddr *adresse,
                   socklen_t *adresslaenge, int schalter);

BESCHREIBUNG

       Der  Systemaufruf  accept() wird mit den verbindungsbasierten Sockettypen (SOCK_STREAM und
       SOCK_SEQPACKET) benutzt. Er extrahiert die erste Verbindungsanfrage in  der  Warteschlange
       ausstehender  Verbindungen  für das wartende Socket sockfd, erzeugt eine neues verbundenes
       Socket und gibt einen neuen Datei-Deskriptor zurück, der sich auf dieses  Socket  bezieht.
       Das  neu  erstellte  Socket ist nicht im Wartezustand. Das Original-Socket sockfd wird von
       diesem Aufruf nicht beeinflusst.

       Das Argument sockfd ist ein Socket, das mit socket(2) erstellt wurde, mit bind(2) an  eine
       lokale Adresse gebunden ist und nach einem listen(2) auf Verbindungen wartet.

       Das Argument adresse ist ein Zeiger auf eine sockaddr-Struktur. Diese Struktur enthält die
       Adresse des Peer-Sockets, wie sie der Kommunikationsschicht bekannt ist. Das exakte Format
       der  zurückgegebenen  Adresse  adresse wird durch die Adressfamilie des Sockets festgelegt
       (siehe socket(2) und die jeweiligen Protokoll-Handbuchseiten). Wenn adresse NULL ist, wird
       nichts  eingrtragen;  in  diesem Fall wird adresslaenge nicht benutzt und sollte auch NULL
       sein.

       Das  Argument  adresslaenge  ist  ein  Wert-Ergebnis-Argument:  Der  Aufrufende  muss   es
       initialisieren,  um  die  Größe (in Byte) der Struktur zu erhalten, auf die adresse zeigt;
       bei der Rückkehr wird es die tatsächliche Größe der Peer-Adresse enthalten.

       Die zurückgegebene Adresse wird gekürzt, falls der bereitgestellte Puffer zu klein ist. In
       diesem Fall gibt addrlen einen Wert zurück, der größer als der übergebene Wert ist.

       Falls  keine  ausstehenden Verbindungen in der Warteschlange sind und das Socket nicht als
       »nonblocking« gekennzeichnet ist, blockt accept()  den  Aufrufenden  bis  eine  Verbindung
       besteht.  Wenn  das  Socket  als »nonblocking« gekennzeichnet ist und in der Warteschlange
       keine ausstehenden Verbindungen enthält, schlägt  accept()  mit  dem  Fehler  EAGAIN  oder
       EWOULDBLOCK fehl.

       Zur Information über neu auf dem Socket eintreffende Verbindungen, kann select(2), poll(2)
       oder epoll(7) benutzt werden. Wenn versucht wird, eine neue Verbindung zu erstellen,  wird
       ein  lesbares Ereignis geliefert und sie können accept() aufrufen, um ein Socket für diese
       Verbindung zu erhalten. Alternativ können Sie das Socket zum Setzen von SIGIO veranlassen,
       wenn  es  auf  dem  Socket  zu  Aktivität  kommt;  lesen Sie socket(7), um Einzelheiten zu
       erhalten.

       Falls schalter 0 ist, dann entspricht accept4() accept(). Die folgenden  Werte  können  in
       schalter bitweise ODER-verknüpft werden, um ein unterschiedliches Verhalten zu bewirken:

       SOCK_NONBLOCK   Setzt    den    Dateistatus-Schalter    O_NONBLOCK   für   die   geöffnete
                       Datei-Deskription (siehe open(2)), auf die sich der  neue  Dateideskriptor
                       bezieht.  Die  Verwendung  dieses  Schalters spart zusätzliche Aufrufe von
                       fcntl(2), um das gleiche Ergebnis zu erreichen.

       SOCK_CLOEXEC    Setzt den Schalter »Schließen bei Ausführung« (close-on-exec,  FD_CLOEXEC)
                       für  den  neuen  Dateideskriptor. Lesen Sie die Beschreibung des Schalters
                       O_CLOEXEC in open(2), um die Gründe zu  beleuchten,  warum  dies  nützlich
                       sein könnte.

RÜCKGABEWERT

       Bei  Erfolg  geben  diese  Systemaufrufe  eine  nicht  negative  Ganzzahl  zurück, die ein
       Dateideskriptor für das akzeptierte Socket ist. Bei einem Fehler  wird  -1  zurückgegeben,
       errno entsprechend gesetzt und addrlen verbleibt unverändert.

   Fehlerbehandlung
       Die  Linux-Version  von  accept()  (und  accept4())  reichen  alle  noch nicht behandelten
       Netzwerkfehler an das neue  Socket  als  einen  Fehlerkode  von  accept()  weiter.  Dieses
       Verhalten unterscheidet sich von anderen Implementierungen des BSD-Sockets. Um zuverlässig
       operieren zu können, sollte die Anwendung die für das Protokoll nach accept()  definierten
       Netzwerkfehler  aufspüren  und  sie  wie EAGAIN durch erneutes Probieren verfolgen. Im dem
       Fall von TCP/IP sind dies ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET,  EHOSTUNREACH,
       EOPNOTSUPP und ENETUNREACH.

FEHLER

       EAGAIN oder EWOULDBLOCK
              Das  Socket  ist  als  »nonblocking«  gekennzeichnet und es sind keine Verbindungen
              vorhanden, die akzeptiert werden müssen. POSIX.1-2001 und POSIX.1-2008 erlauben  in
              diesem  Fall  auch  die  Rückgabe  beider  Fehlers  und verlangen nicht, dass diese
              Konstanten den gleichen Wert haben. Deshalb sollte eine  portable  Anwendung  beide
              Möglichkeiten prüfen.

       EBADF  sockfd ist kein Deskriptor für eine geöffnete Datei.

       ECONNABORTED
              Eine Verbindung wurde abgebrochen.

       EFAULT Das Argument adresse ist kein beschreibbarer Teil des Adressraums des Benutzers.

       EINTR  Der  Systemaufruf  wurde  vor  dem  Eintreffen  einer gültigen Verbindung durch ein
              Signal unterbrochen; lesen Sie signal(7).

       EINVAL Das Socket wartet nicht auf  Verbindungen  oder  adresslaenge  ist  ungültig  (z.B.
              negativ).

       EINVAL (accept4()) ungültiger Wert in schalter

       EMFILE Die Beschränkung pro Prozess der Anzahl offener Datei-Deskriptoren wurde erreicht.

       ENFILE Die systemweite Beschränkung für die Gesamtzahl offener Dateien wurde erreicht.

       ENOBUFS, ENOMEM
              Nicht  genug  Speicher.  Dies bedeutet oft, dass die Speicherreservierung durch die
              Socket-Pufferbeschränkungen begrenzt ist und nicht durch den Systemspeicher.

       ENOTSOCK
              Der Dateideskriptor sockfd zeigt nicht auf ein Socket.

       EOPNOTSUPP
              Das referenzierte Socket ist nicht vom Typ SOCK_STREAM.

       EPROTO Protokollfehler

       Zusätzlich könnte Linux-accept() fehlschlagen, falls:

       EPERM  Firewallregeln die Verbindung verbieten

       Zusätzlich könnten Netzwerkfehler für das neue  Socket  und  wie  sie  für  das  Protokoll
       definiert  sind,  zurückgegeben  werden.  Verschiedene  Linux-Kernel  können andere Fehler
       zurückgeben,  wie  ENOSR,  ESOCKTNOSUPPORT,  EPROTONOSUPPORT  oder  ETIMEDOUT.  Der   Wert
       ERESTARTSYS kann bei einer Ablaufverfolgung auftreten.

VERSIONEN

       Der  Systemaufruf  accept4()  ist  seit Linux 2.6.28 verfügbar; Unterstützung in Glibc ist
       seit Version 2.10 verfügbar.

KONFORM ZU

       accept(): POSIX.1-2001, POSIX.1-2008,  SVr4,  4.4BSD  (accept()  erstmalig  erschienen  in
       4.2BSD).

       accept4() ist keine Standard-Linux-Erweiterung.

       Auf Linux erbt das neue, von accept() zurückgegebene Socket nicht die Datei-Statusschalter
       wie O_NONBLOCK und O_ASYNC vom wartenden Socket. Dieses Verhalten unterscheidet  sich  von
       der  vorschriftsmäßigen  BSD-Socket-Implementierung. Portable Programme sollten sich nicht
       auf Vererbung oder Nicht-Vererbung der Datei-Statusschalter verlassen und  immer  explizit
       alle benötigten Schalter des Sockets setzen, das sie von accept() zurückbekommen.

ANMERKUNGEN

       POSIX.1-2001  erfordert nicht, dass <sys/types.h> eingebunden wird. Diese Header-Datei ist
       in Linux nicht erforderlich. Allerdings  benötigen  einige  historische  Implementierungen
       (BSD) diese Header-Datei. Es wird empfohlen, sie für portierbare Anwendungen einzubinden.

       Es  könnte  sein,  dass  nicht  immer eine Verbindung wartet, nachdem ein SIGIO zugestellt
       wurde oder select(2), poll(2) oder epoll(7) ein Lesbarkeitsereignis zurückgeben, weil  die
       Verbindung  von  einem asynchronen Netwerkfehler oder einem anderen Thread entfernt worden
       sein könnte bevor accept() aufgerufen wurde. Falls dies geschieht,  wird  der  Aufruf  das
       Warten  auf  die  Ankunft  der  nächsten  Verbindung  blockieren. Um sicherzustellen, dass
       accept()  niemals  blockiert,  muss  beim  durchgereichten  Socket  sockfd  der   Schalter
       O_NONBLOCK gesetzt werden (siehe socket(7)).

       Bei  bestimmten  Protokollen,  die  eine explizite Bestätigung verlangen, wie DECnet, kann
       davon ausgegangen werden, dass 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 Ablehnung  kann  durch  ein
       Schließen  des  neuen Sockets impliziert werden. Derzeit verfügt nur DECnet auf Linux über
       diese Semantik.

   Der Typ socklen_t
       In der ursprünglichen BSD-Socket-Implementierung (und in anderen älteren Systemen) war das
       dritte  Argument  von  accept()  als  int * deklariert. Ein Entwurf des Standards POSIX.1g
       wollte es auf size_t *C ändern, spätere POSIX-Standards und Glibc 2.x haben socklen_t * .

BEISPIEL

       Siehe bind(2).

SIEHE AUCH

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

KOLOPHON

       Diese Seite  ist  Teil  der  Veröffentlichung  5.03  des  Projekts  Linux-man-pages.  Eine
       Beschreibung  des  Projekts,  Informationen,  wie  Fehler gemeldet werden können sowie die
       aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die   deutsche   Übersetzung    dieser    Handbuchseite    wurde    von    Hanno    Wagner
       <wagner@bidnix.bid.fh-hannover.de> und Chris Leick <c.leick@vollbio.de> erstellt.

       Diese  Übersetzung  ist  Freie  Dokumentation;  lesen  Sie  die GNU General Public License
       Version  3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE   HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.