Provided by: manpages-fr-dev_4.13-4_all 

NOM
accept, accept4 - Accepter une connexion sur une socket
SYNOPSIS
#include <sys/types.h> /* Consultez NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
#define _GNU_SOURCE /* Consultez feature_test_macros(7) */
#include <sys/socket.h>
int accept4(int sockfd, struct sockaddr *addr,
socklen_t *addrlen, int flags);
DESCRIPTION
L'appel système accept() est employé avec les sockets utilisant un protocole en mode connecté
(SOCK_STREAM, SOCK_SEQPACKET). Il extrait la première connexion de la file des connexions en attente de
la socket sockfd à l'écoute, crée une nouvelle socket et alloue pour cette socket un nouveau descripteur
de fichier qu'il renvoie. La nouvelle socket n'est pas en état d'écoute. La socket originale sockfd n'est
pas modifiée par l'appel système.
L'argument sockfd est une socket qui a été créée avec la fonction socket(2), attachée à une adresse avec
bind(2), et attend des connexions après 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
paramètre addr dépend du domaine dans lequel la communication s'établit (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 utilisé et doit aussi valoir NULL.
addrlen est un paramètre-résultat : l'appelant doit l'initialiser de telle sorte qu'il contienne la
taille (en octets) de la structure pointée par addr, et est renseigné au retour par la longueur réelle
(en octets) de l'adresse remplie.
L'adresse renvoyée est tronquée si le tampon fourni est trop petit ; dans ce cas, addrlen renverra une
valeur supérieure à celle fournie lors de l'appel.
S'il n'y a pas de connexion en attente dans la file, et si la socket n'est pas marquée comme non
bloquante, accept() se met en attente d'une connexion. Si la socket est non bloquante, et qu'aucune
connexion n'est présente dans la file, accept() retourne une erreur EAGAIN ou EWOULDBLOCK.
Pour être prévenu de l'arrivée d'une connexion sur une socket, on peut utiliser select(2), poll(2) ou
epoll(7). Un événement « lecture » sera délivré lorsqu'une tentative de connexion aura lieu, et on pourra
alors appeler accept() pour obtenir une socket pour cette connexion. Autrement, on peut configurer la
socket pour qu'elle envoie un signal SIGIO lorsqu'une activité la concernant se produit, consultez
socket(7) pour plus de détails.
Si flags vaut 0 alors accept4() est identique à accept(). Les valeurs suivantes peuvent être combinées
dans flags par un OU binaire pour obtenir un comportement différent :
SOCK_NONBLOCK Placer l'attribut d'état de fichier O_NONBLOCK sur la description du fichier ouvert
référencée par le nouveau descripteur de fichier (consulter open(2)). Utiliser cet
attribut économise des appels supplémentaires à fcntl(2) pour obtenir le même résultat.
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 être utile.
VALEUR RENVOYÉE
S'ils réussissent, ces appels système renvoient un descripteur de fichier pour la socket acceptée (un
entier positif ou nul). En cas d'erreur, ils renvoient -1, errno est défini en fonction et addrlen est
laissé inchangé.
Traitement des erreurs
Sous Linux, accept() (et accept4()) renvoie les erreurs réseau déjà en attente sur la socket comme une
erreur de l'appel système. Ce comportement diffère d'autres implémentations des sockets BSD. Pour un
comportement fiable, une application doit détecter les erreurs réseau définies par le protocole après le
accept() et les traiter comme des erreurs EAGAIN, en réitérant le mécanisme. Dans le cas de TCP/IP, ces
erreurs sont ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, et ENETUNREACH.
ERREURS
EAGAIN ou EWOULDBLOCK
La socket est marquée comme étant non bloquante et aucune connexion n'est présente pour être
acceptée. 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 même valeur. Une application portable devrait donc
tester les deux possibilités.
EBADF sockfd n'est pas un descripteur de fichier valable.
ECONNABORTED
Une connexion a été abandonnée.
EFAULT addr n'est pas dans l'espace d'adressage accessible en écriture.
EINTR L'appel système a été interrompu par l'arrivée d'un signal avant qu'une connexion valable ne
survienne ; consultez signal(7).
EINVAL La socket n'est pas en attente de connexions, ou addrlen est non autorisée (par exemple négatif).
EINVAL (accept4()) flags contient une valeur incorrecte.
EMFILE La limite du nombre de descripteurs de fichiers par processus a été atteinte.
ENFILE La limite du nombre total de fichiers ouverts pour le système entier a été atteinte.
ENOBUFS, ENOMEM
Pas assez de mémoire disponible. En général, cette erreur est due à la taille limitée du tampon
des sockets, et non à la mémoire système proprement dite.
ENOTSOCK
Le descripteur de fichier sockfd ne fait pas référence à un socket.
EOPNOTSUPP
La socket utilisée n'est pas de type SOCK_STREAM.
EPROTO Erreur de protocole.
De plus, la version Linux de accept() peut échouer si :
EPERM Les règles du pare-feu interdisent la connexion.
De plus il peut se produire des erreurs réseau dépendant du protocole de la socket. Certains noyaux Linux
peuvent renvoyer d'autres erreurs comme ENOSR, ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT. L'erreur
ERESTARTSYS peut être rencontrée durant un suivi dans un débogueur.
VERSIONS
L'appel système accept4() est disponible depuis Linux 2.6.28 ; la prise en charge dans la glibc est
disponible depuis la version 2.10.
CONFORMITÉ
accept() : POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (accept() est apparu dans BSD 4.2).
accept4() est une extension non standard de Linux.
Avec la version Linux de accept(), la nouvelle socket n'hérite pas des attributs comme O_NONBLOCK et
O_ASYNC de la socket en écoute. Ce comportement est différent de l'implémentation BSD de référence. Les
programmes portables ne doivent pas s'appuyer sur cette particularité, et doivent reconfigurer les
attributs sur la socket renvoyée par accept().
NOTES
POSIX.1-2001 ne requiert pas l'inclusion de <sys/types.h>, et cet en-tête n'est pas nécessaire sous
Linux. Cependant, il doit être inclus sous certaines implémentations historiques (BSD), et les
applications portables devraient probablement l'utiliser.
Il n'y a pas nécessairement de connexion en attente après la réception de SIGIO ou après que select(2),
poll(2) ou epoll(7) indiquent quelque chose à lire. En effet la connexion peut avoir été annulée à cause
d'une erreur de réseau asynchrone ou par un autre thread avant que accept() ne soit appelé. Si cela se
produit, l'appel bloquera en attendant une autre connexion. Pour s'assurer que accept() ne bloquera
jamais, la socket sockfd transmise doit avoir l'attribut O_NONBLOCK (consultez socket(7)).
Pour certains protocoles nécessitant une confirmation explicite, comme DECNet, accept() peut être
considéré comme extrayant simplement la connexion suivante de la file, sans demander de confirmation. On
peut effectuer la confirmation par une simple lecture ou écriture sur le nouveau descripteur, et le rejet
en fermant la nouvelle socket. Pour le moment, seul DECNet se comporte ainsi sous Linux.
Le type socklen_t
Dans l'implémentation des sockets de BSD originale (et sur d'autres anciens systèmes), le troisième
paramètre de accept() était déclaré 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)
COLOPHON
Cette page fait partie de la publication 5.10 du projet man-pages Linux. Une description du projet et des
instructions pour signaler des anomalies et la dernière version de cette page peuvent être trouvées à
l'adresse https://www.kernel.org/doc/man-pages/.
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess
<https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud
<tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard
<fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau
<jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François
<nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard
<simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot
<david@tilapin.org>, Cédric Boutillier <cedric.boutillier@gmail.com>, Frédéric Hantrais
<fhantrais@gmail.com> et Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License
version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à
debian-l10n-french@lists.debian.org.
Linux 11 avril 2020 ACCEPT(2)