accept

ACCEPT(2)                   Linux-Programmierhandbuch                  ACCEPT(2)



BEZEICHNUNG
       accept, accept4 – nimmt eine Verbindung auf einem Socket an

ÜBERSICHT
       #include <sys/socket.h>

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

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

       int accept4(int sockfd, struct sockaddr *restrict adresse,
                  socklen_t *restrict 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 adresslaenge 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 einen Dateideskriptor für das
       akzeptierte Socket (eine nicht negative Ganzzahl) zurück. Bei einem
       Fehler wird -1 zurückgegeben, errno gesetzt, um den Fehler anzuzeigen,
       und adresslaenge 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
              Fehler 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 sockdd zeigt nicht auf ein Socket.

       EOPNOTSUPP
              Das referenzierte Socket ist nicht vom Typ SOCK_STREAM.

       EPERM  Firewallregeln die Verbindung verbieten

       EPROTO Protokollfehler

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

BEISPIELE
       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.13 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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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 die Mailingliste der Übersetzer ⟨debian-l10n-
       german@lists.debian.org⟩.



Linux                            27. August 2021                       ACCEPT(2)