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

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)