bionic (2) accept.2.gz

Provided by: manpages-fr-dev_3.65d1p1-1_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) ou poll(2). Un
       événement « lecture » sera délivré lorsqu'une tentative de  connexion  aura  lieu,  et  on  pourra  alors
       appeler  accept()  pour la valider. 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.

       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.

       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  le  nouveau  descripteur  de  fichier
                       ouvert.  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 entier positif ou nul, qui est un descripteur pour  la
       socket acceptée. En cas d'erreur, ils renvoient -1 et remplissent errno avec le code d'erreur.

   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 permet 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  Le descripteur est invalide.

       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  valide  ne
              survienne ; consultez signal(7).

       EINVAL La socket n'est pas en attente de connexions, ou addrlen est invalide (par exemple négatif).

       EINVAL (accept4()) flags contient une valeur incorrecte.

       EMFILE La limite du nombre total de descripteurs de fichier ouverts par processus a été atteinte.

       ENFILE La limite du nombre total de fichiers ouverts sur le système 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 n'est pas celui d'une 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, SVr4, BSD 4.4 (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) ou
       poll(2) indiquent quelque chose à lire. En effet la connexion peut avoir été annulée à cause d'une erreur
       réseau asynchrone ou par un autre thread avant que accept() ne se termine. 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)).

   Le type socklen_t
       Le troisième argument de accept() était, à l'origine, déclaré comme un int * (ceci dans  libc4  et  libc5
       ainsi  que  pour  beaucoup  d'autres  systèmes  comme BSD 4.x, SunOS 4, SGI). Une proposition de standard
       POSIX.1g l'a modifié en size_t * et c'est ce qu'utilise SunOS 5. Les dernières propositions POSIX en  ont
       fait  un  socklen_t  *,  ce  que  suivent  la  Single  UNIX  Specification et la glibc2. Pour citer Linus
       Torvalds :

       « Toute bibliothèque sensée doit garder "socklen_t" équivalent à un int. Toute autre  chose  invaliderait
       tout  le  niveau  des  sockets  BSD. POSIX l'avait d'abord remplacé par un size_t, et je m'en suis plaint
       violemment (ainsi que d'autres heureusement, mais de toute évidence, pas assez). Le remplacement  par  un
       size_t  est  complètement  stupide  car  size_t a rarement la même taille qu'un int sur les architectures
       64 bits par exemple. Et il doit avoir la même taille  qu'un  "int"  parce  que  c'était  l'interface  des
       sockets BSD. Quoi qu'il en soit, les gens de POSIX ont compris et ont créé un "socklen_t". Ils n'auraient
       jamais dû y toucher, mais une fois commencé, ils ont décidé de créer un type spécifique, pour des raisons
       inavouées  (probablement  quelqu'un  qui  ne veut pas perdre la face en expliquant que le premier travail
       était stupide et ils ont simplement renommé leur bricolage). »

EXEMPLE

       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 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe       Blaess       <http://www.blaess.fr/christophe/>      (1996-2003),      Alain      Portal
       <http://manpagesfr.free.fr/> (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction  de
       Debian (2006-2009).

       Veuillez  signaler  toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».