accept(2) System Calls Manual accept(2) BEZEICHNUNG accept, accept4 - nimmt eine Verbindung auf einem Socket an BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int accept(int sockdd, struct sockaddr *_Nullable restrict adresse, socklen_t *_Nullable restrict adresslaenge); #define _GNU_SOURCE /* siehe feature_test_macros(7) */ #include int accept4(int sockdd, struct sockaddr *_Nullable restrict adresse, socklen_t *_Nullable 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 fur das wartende Socket sockdd, erzeugt eine neues verbundenes Socket und gibt einen neuen Datei-Deskriptor zuruck, der sich auf dieses Socket bezieht. Das neu erstellte Socket ist nicht im Wartezustand. Das Original-Socket sockdd wird von diesem Aufruf nicht beeinflusst. Das Argument sockdd 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 enthalt die Adresse des Peer-Sockets, wie sie der Kommunikationsschicht bekannt ist. Das exakte Format der zuruckgegebenen 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 Grosse (in Byte) der Struktur zu erhalten, auf die adresse zeigt; bei der Ruckkehr wird es die tatsachliche Grosse der Peer-Adresse enthalten. Die zuruckgegebene Adresse wird gekurzt, falls der bereitgestellte Puffer zu klein ist. In diesem Fall gibt adresslaenge einen Wert zuruck, der grosser als der ubergebene 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 enthalt, schlagt accept() mit dem Fehler EAGAIN oder EWOULDBLOCK fehl. Zur Information uber 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 konnen accept() aufrufen, um ein Socket fur diese Verbindung zu erhalten. Alternativ konnen Sie das Socket zum Setzen von SIGIO veranlassen, wenn es auf dem Socket zu Aktivitat kommt; lesen Sie socket(7), um Einzelheiten zu erhalten. Falls schalter 0 ist, dann entspricht accept4() accept(). Die folgenden Werte konnen in schalter bitweise ODER-verknupft werden, um ein unterschiedliches Verhalten zu bewirken: SOCK_NONBLOCK Setzt den Dateistatus-Schalter O_NONBLOCK fur die geoffnete Datei-Deskription (siehe open(2)), auf die sich der neue Dateideskriptor bezieht. Die Verwendung dieses Schalters spart zusatzliche Aufrufe von fcntl(2), um das gleiche Ergebnis zu erreichen. SOCK_CLOEXEC Setzt den Schalter >>Schliessen bei Ausfuhrung<< (close-on-exec, FD_CLOEXEC) fur den neuen Dateideskriptor. Lesen Sie die Beschreibung des Schalters O_CLOEXEC in open(2), um die Grunde zu beleuchten, warum dies nutzlich sein konnte. RUCKGABEWERT Bei Erfolg geben diese Systemaufrufe einen Dateideskriptor fur das akzeptierte Socket (eine nicht negative Ganzzahl) zuruck. Bei einem Fehler wird -1 zuruckgegeben, errno gesetzt, um den Fehler anzuzeigen, und adresslaenge verbleibt unverandert. 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 zuverlassig operieren zu konnen, sollte die Anwendung die fur das Protokoll nach accept() definierten Netzwerkfehler aufspuren 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 mussen. POSIX.1-2001 und POSIX.1-2008 erlauben in diesem Fall auch die Ruckgabe beider Fehler und verlangen nicht, dass diese Konstanten den gleichen Wert haben. Deshalb sollte eine portable Anwendung beide Moglichkeiten prufen. EBADF sockdd ist kein Deskriptor fur eine geoffnete 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 gultigen Verbindung durch ein Signal unterbrochen; lesen Sie signal(7). EINVAL Das Socket wartet nicht auf Verbindungen oder adresslaenge ist ungultig (z.B. negativ). EINVAL (accept4()) ungultiger Wert in schalter EMFILE Die Beschrankung pro Prozess der Anzahl offener Datei-Deskriptoren wurde erreicht. ENFILE Die systemweite Beschrankung fur die Gesamtzahl offener Dateien wurde erreicht. ENOBUFS ENOMEM Nicht genug Speicher. Dies bedeutet oft, dass die Speicherreservierung durch die Socket-Pufferbeschrankungen 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 Zusatzlich konnten Netzwerkfehler fur das neue Socket und wie sie fur das Protokoll definiert sind, zuruckgegeben werden. Verschiedene Linux-Kernel konnen andere Fehler zuruckgeben, wie ENOSR, ESOCKTNOSUPPORT, EPROTONOSUPPORT oder ETIMEDOUT. Der Wert ERESTARTSYS kann bei einer Ablaufverfolgung auftreten. VERSIONEN Auf Linux erbt das neue, von accept() zuruckgegebene Socket nicht die Datei-Statusschalter wie O_NONBLOCK und O_ASYNC vom wartenden Socket. Dieses Verhalten unterscheidet sich von der vorschriftsmassigen BSD-Socket-Implementierung. Portable Programme sollten sich nicht auf Vererbung oder Nicht-Vererbung der Datei-Statusschalter verlassen und immer explizit alle benotigten Schalter des Sockets setzen, das sie von accept() zuruckbekommen. STANDARDS accept() POSIX.1-2008. accept4() Linux. GESCHICHTE accept() POSIX.1-2001, SVr4, 4.4BSD (accept() erschien zuerst in 4.2BSD). accept4() Linux 2.6.28, Glibc 2.10. ANMERKUNGEN Es konnte sein, dass nicht immer eine Verbindung wartet, nachdem ein SIGIO zugestellt wurde oder select(2), poll(2) oder epoll(7) ein Lesbarkeitsereignis zuruckgeben, weil die Verbindung von einem asynchronen Netwerkfehler oder einem anderen Thread entfernt worden sein konnte bevor accept() aufgerufen wurde. Falls dies geschieht, wird der Aufruf das Warten auf die Ankunft der nachsten Verbindung blockieren. Um sicherzustellen, dass accept() niemals blockiert, muss beim durchgereichten Socket sockdd der Schalter O_NONBLOCK gesetzt werden (siehe socket(7)). Bei bestimmten Protokollen, die eine explizite Bestatigung verlangen, wie DECnet, kann davon ausgegangen werden, dass accept() nur die nachste Verbindung aus der Warteschlange holt ohne sie automatisch zu bestatigen. Die Bestatigung kann ein normaler Lese- oder Schreibvorgang auf dem neuen Deskriptor mit sich bringen, eine Ablehnung kann durch ein Schliessen des neuen Sockets impliziert werden. Derzeit verfugt nur DECnet auf Linux uber diese Semantik. Der Typ socklen_t In der ursprunglichen BSD-Socket-Implementierung (und in anderen alteren Systemen) war das dritte Argument von accept() als int * deklariert. Ein Entwurf des Standards POSIX.1g wollte es auf size_t *C andern, spatere 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Hanno Wagner und Chris Leick erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 accept(2)