accept(2) System Calls Manual accept(2) NOM accept, accept4 - Accepter une connexion sur un socket BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int accept(int sockfd, struct sockaddr *_Nullable restrict addr, socklen_t *_Nullable restrict addrlen); #define _GNU_SOURCE /* Consultez feature_test_macros(7) */ #include int accept4(int sockfd, struct sockaddr *_Nullable restrict addr, socklen_t *_Nullable restrict addrlen, int flags); DESCRIPTION L'appel systeme accept() est employe avec les sockets utilisant un protocole en mode connecte (SOCK_STREAM, SOCK_SEQPACKET). Il extrait la premiere connexion de la file des connexions en attente du socket sockfd a l'ecoute, cree un nouveau socket et alloue pour ce socket un nouveau descripteur de fichier qu'il renvoie. Le nouveau socket n'est pas en etat d'ecoute. L socket original sockfd n'est pas modifie par l'appel systeme. L'argument sockfd est un socket qui a ete cree avec la fonction socket(2), attache a une adresse avec bind(2), et attend des connexions apres un appel listen(2). L'argument addr est un pointeur sur une structure sockaddr. La structure sera remplie avec l'adresse du correspondant se connectant, telle qu'elle est connue par la couche de communication. Le format exact du parametre addr depend du domaine dans lequel la communication s'etablit (consultez socket(2) et la page de manuel correspondant au protocole). Quand addr vaut NULL, rien n'est rempli ; dans ce cas, addrlen n'est pas utilise et doit aussi valoir NULL. addrlen est un parametre-resultat : l'appelant doit l'initialiser de telle sorte qu'il contienne la taille (en octets) de la structure pointee par addr, et est renseigne au retour par la longueur reelle (en octets) de l'adresse remplie. L'adresse renvoyee est tronquee si le tampon fourni est trop petit ; dans ce cas, addrlen renverra une valeur superieure a celle fournie lors de l'appel. S'il n'y a pas de connexion en attente dans la file, et si le socket n'est pas marque comme non bloquant, accept() se met en attente d'une connexion. Si le socket est non bloquant, et qu'aucune connexion n'est presente dans la file, accept() retourne une erreur EAGAIN ou EWOULDBLOCK. Pour etre prevenu de l'arrivee d'une connexion sur un socket, on peut utiliser select(2), poll(2) ou epoll(7). Un evenement << lecture >> sera delivre lorsqu'une tentative de connexion aura lieu, et on pourra alors appeler accept() pour obtenir un socket pour cette connexion. Autrement, on peut configurer le socket pour qu'il envoie un signal SIGIO lorsqu'une activite le concernant se produit, consultez socket(7) pour plus de details. Si flags vaut 0 alors accept4() est identique a accept(). Les valeurs suivantes peuvent etre combinees dans flags par un OU binaire pour obtenir un comportement different : SOCK_NONBLOCK Placer l'attribut d'etat de fichier O_NONBLOCK sur la description du fichier ouvert referencee par le nouveau descripteur de fichier (consulter open(2)). Utiliser cet attribut economise des appels supplementaires a fcntl(2) pour obtenir le meme resultat. SOCK_CLOEXEC Placer l'attribut << close-on-exec >> (FD_CLOEXEC) sur le nouveau descripteur de fichier. Consultez la description de l'attribut O_CLOEXEC dans open(2) pour savoir pourquoi cela peut etre utile. VALEUR RENVOYEE S'ils reussissent, ces appels systeme renvoient un descripteur de fichier pour le socket accepte (un entier positif ou nul). En cas d'erreur, ils renvoient -1, errno est positionne pour indiquer l'erreur et addrlen est laisse inchange. Traitement des erreurs Sous Linux, accept() (et accept4()) renvoie les erreurs reseau deja en attente sur le nouveau socket comme une erreur de l'appel systeme. Ce comportement differe d'autres implementations des sockets BSD. Pour un comportement fiable, une application doit detecter les erreurs reseau definies par le protocole apres le accept() et les traiter comme des erreurs EAGAIN, en reiterant le mecanisme. Dans le cas de TCP/IP, ces erreurs sont ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, et ENETUNREACH. ERREURS EAGAIN ou EWOULDBLOCK Le socket est marque comme etant non bloquant et aucune connexion n'est presente pour etre acceptee. POSIX.1-2001 et POSIX.1-2008 permettent de renvoyer l'une ou l'autre des erreurs dans ce cas et n'exige pas que ces constantes aient la meme valeur. Une application portable devrait donc tester les deux possibilites. EBADF sockfd n'est pas un descripteur de fichier valable. ECONNABORTED Une connexion a ete abandonnee. EFAULT addr n'est pas dans l'espace d'adressage accessible en ecriture. EINTR L'appel systeme a ete interrompu par l'arrivee d'un signal avant qu'une connexion valable ne survienne ; consultez signal(7). EINVAL Le socket n'est pas en attente de connexions, ou addrlen est non autorisee (par exemple negatif). EINVAL (accept4()) flags contient une valeur incorrecte. EMFILE La limite du nombre de descripteurs de fichiers par processus a ete atteinte. ENFILE La limite du nombre total de fichiers ouverts pour le systeme entier a ete atteinte. ENOBUFS ENOMEM Pas assez de memoire disponible. En general, cette erreur est due a la taille limitee du tampon des sockets, et non a la memoire systeme proprement dite. ENOTSOCK Le descripteur de fichier sockfd ne fait pas reference a un socket. EOPNOTSUPP Le socket utilise n'est pas de type SOCK_STREAM. EPERM Les regles du pare-feu interdisent la connexion. EPROTO Erreur de protocole. De plus il peut se produire des erreurs reseau dependant du protocole du socket. Certains noyaux Linux peuvent renvoyer d'autres erreurs comme ENOSR, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT. L'erreur ERESTARTSYS peut etre rencontree durant un suivi dans un debogueur. VERSIONS Avec la version Linux de accept(), le nouveau socket n'herite pas des attributs comme O_NONBLOCK et O_ASYNC du socket en ecoute. Ce comportement est different de l'implementation BSD de reference. Les programmes portables ne doivent pas s'appuyer sur cette particularite, et doivent reconfigurer les attributs sur le socket renvoye par accept(). STANDARDS accept() POSIX.1-2008. accept4() Linux. HISTORIQUE accept() POSIX.1-2001, SVr4, 4.4BSD (accept() est apparu dans 4.2BSD). accept4() Linux 2.6.28, glibc 2.10. NOTES Il n'y a pas necessairement de connexion en attente apres la reception de SIGIO ou apres que select(2), poll(2) ou epoll(7) indiquent quelque chose a lire. En effet la connexion peut avoir ete annulee a cause d'une erreur de reseau asynchrone ou par un autre thread avant que accept() ne soit appele. Si cela se produit, l'appel bloquera en attendant une autre connexion. Pour s'assurer que accept() ne bloquera jamais, le socket sockfd transmis doit avoir l'attribut O_NONBLOCK (consultez socket(7)). Pour certains protocoles necessitant une confirmation explicite, comme DECNet, accept() peut etre considere comme extrayant simplement la connexion suivante de la file, sans demander de confirmation. On peut effectuer la confirmation par une simple lecture ou ecriture sur le nouveau descripteur, et le rejet en fermant le nouveau socket. Pour le moment, seul DECNet se comporte ainsi sous Linux. Le type socklen_t Dans l'implementation des sockets de BSD originale (et sur d'autres anciens systemes), le troisieme parametre de accept() etait declare en tant que int *. Un brouillon du standard POSIX.1g voulait le changer pour size_t *C ; les derniers standards POSIX et glibc 2.x mentionnent socklen_t * . EXEMPLES Consultez bind(2). VOIR AUSSI bind(2), connect(2), listen(2), select(2), socket(2), socket(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 accept(2)