Provided by: manpages-fr-dev_3.57d1p1-1_all bug

NOM

       recv, recvfrom, recvmsg - Recevoir un message sur une socket

SYNOPSIS

       #include <sys/types.h>
       #include <sys/socket.h>

       ssize_t recv(int sockfd, void *buf, size_t len, int flags);

       ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                        struct sockaddr *src_addr, socklen_t *addrlen);

       ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

DESCRIPTION

       Les appels système recvfrom() et recvmsg() sont utilisés pour recevoir des messages depuis une socket, et
       peuvent servir sur une socket orientée connexion ou non.

       Si src_addr n'est pas NULL, et si le protocole sous-jacent fournit l'adresse de la source, celle-ci y est
       insérée.  Quand src_addr vaut NULL, rien n'est inséré ; dans ce cas, addrlen n'est pas utilisé et devrait
       également valoir NULL. addrlen est un paramètre résultat, initialisé à la taille du tampon  src_addr,  et
       modifié  en  retour  pour  indiquer  la  taille  réelle  de l'adresse enregistrée. L'adresse renvoyée est
       tronquée si le tampon fourni est trop petit ; dans ce cas, addrlen renverra une valeur supérieure à celle
       fourni lors de l'appel.

       L'appel  recv()  est  normalement  utilisé sur une socket connectée (voir connect(2)) et est équivalent à
       recvfrom() avec un paramètre src_addr NULL.

       Ces trois routines renvoient la longueur du message si elles réussissent. Si un  message  est  trop  long
       pour  tenir  dans le tampon, les octets supplémentaires peuvent être abandonnés suivant le type de socket
       utilisé.

       Si aucun message n'est disponible sur la socket, les fonctions de réception  se  mettent  en  attente,  à
       moins que la socket soit non bloquante (voir fcntl(2)) auquel cas la valeur -1 est renvoyée, et errno est
       positionnée à EAGAIN ou EWOULDBLOCK.  Les  fonctions  de  réception  renvoient  normalement  les  données
       disponibles sans attendre d'avoir reçu le nombre exact réclamé.

       Les  appels  système  select(2) ou poll(2) peuvent permettre de déterminer si des données supplémentaires
       sont disponibles.

       L'argument flags de l'appel recv() est constitué par un OU binaire entre une  ou  plusieurs  des  valeurs
       suivantes :

       MSG_CMSG_CLOEXEC (recvmsg() uniquement ; depuis Linux 2.6.23)
              Positionne  l'attribut « close-on-exec » pour le descripteur de fichier reçu via un descripteur de
              fichier de domaine UNIX en utilisant l'opération SCM_RIGHTS (décrite dans unix(7)).  Cet  attribut
              est utile pour les mêmes raisons que l'attribut O_CLOEXEC de open(2).

       MSG_DONTWAIT (depuis Linux 2.2)
              Activer  les  opérations  non  bloquantes.  Si  l'opération  devait bloquer, l'appel échouera avec
              l'erreur EAGAIN ou EWOULDBLOCK (on peut aussi activer ce comportement avec l'option O_NONBLOCK  de
              la fonction F_SETFL de fcntl(2)).

       MSG_ERRQUEUE (depuis Linux 2.2)
              Cet  attribut  demande  que  les  erreurs  soient reçues depuis la file d'erreur de la socket. Les
              erreurs sont transmises dans un message annexe dont le type dépend du protocole  (IP_RECVERR  pour
              IPv4).  Il faut alors fournir un tampon de taille suffisante. Consultez cmsg(3) et ip(7) pour plus
              de détails. Le contenu du paquet original qui a causé l'erreur  est  passé  en  tant  que  données
              normales dans msg_iovec. L'adresse de destination originale du datagramme ayant causé l'erreur est
              fournie dans msg_name.

              Pour les erreurs locales, aucune adresse n'est passée (ceci  peut  être  vérifié  dans  le  membre
              cmsg_len  de  cmsghdr).  À  la  réception  d'une erreur, MSG_ERRQUEUE est placé dans msghdr. Après
              réception d'une erreur, l'erreur en attente  sur  la  socket  est  régénérée  en  fonction  de  la
              prochaine erreur dans la file, et sera transmise lors de l'opération suivante sur la socket.

              L'erreur est contenue dans une structure sock_extended_err :

                  #define SO_EE_ORIGIN_NONE    0
                  #define SO_EE_ORIGIN_LOCAL   1
                  #define SO_EE_ORIGIN_ICMP    2
                  #define SO_EE_ORIGIN_ICMP6   3

                  struct sock_extended_err
                  {
                      uint32_t ee_errno;   /* numéro d'erreur */
                      uint8_t  ee_origin;  /* origine de l'erreur */
                      uint8_t  ee_type;    /* type */
                      uint8_t  ee_code;    /* code */
                      uint8_t  ee_pad;     /* remplissage */
                      uint32_t ee_info;    /* données supplémentaires */
                      uint32_t ee_data;    /* autres données */
                      /* Des données supplémentaires peuvent suivre */
                  };

                  struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

              ee_errno  contient le code errno de l'erreur en file. ee_origin est le code d'origine de l'erreur.
              Les autres champs sont spécifiques au protocole. La macro SOCK_EE_OFFENDER renvoie un pointeur sur
              l'adresse  de  l'objet  réseau ayant déclenché l'erreur, à partir d'un pointeur sur le message. Si
              l'adresse n'est pas connue, le membre sa_family de la structure sockaddr contient AF_UNSPEC et les
              autres  champs  de  la  structure  sockaddr  sont  indéfinis. Le contenu du paquet ayant déclenché
              l'erreur est transmis en données normales.

              Pour les erreurs locales, aucune adresse n'est passée (ceci  peut  être  vérifié  dans  le  membre
              cmsg_len  de  cmsghdr).  À  la  réception  d'une erreur, MSG_ERRQUEUE est placé dans msghdr. Après
              réception d'une erreur, l'erreur en attente  sur  la  socket  est  régénérée  en  fonction  de  la
              prochaine erreur dans la file, et sera transmise lors de l'opération suivante sur la socket.

       MSG_OOB
              Cette  option  permet la lecture des données hors-bande qui ne seraient autrement pas placées dans
              le flux de données normales. Certains protocoles placent ces données hors-bande en tête de la file
              normale, et cette option n'a pas lieu d'être dans ce cas.

       MSG_PEEK
              Cette  option  permet  de lire les données en attente dans la file sans les enlever de cette file.
              Ainsi une lecture ultérieure renverra à nouveau les mêmes données.

       MSG_TRUNC (depuis Linux 2.2)
              Pour les socket en mode brut (AF_PACKET),  datagramme  Internet  (depuis  Linux  2.4.27/2.6.8)  et
              netlink  (depuis  Linux 2.6.22) : renvoyer la taille réelle du paquet ou datagramme, même quand il
              est plus grand que le tampon fourni.

              Pour une utilisation avec des sockets en mode flux, consultez tcp(7).

       MSG_WAITALL (depuis Linux 2.2)
              Cette option demande que l'opération de lecture soit bloquée jusqu'à ce que  la  requête  complète
              soit  satisfaite.  Toutefois, la lecture peut renvoyer quand même moins de données que prévu si un
              signal est reçu, ou si une erreur ou une déconnexion se produisent.

       L'appel recvmsg() utilise une  structure  msghdr  pour  minimiser  le  nombre  de  paramètres  à  fournir
       directement. Cette structure est définie dans <sys/socket.h> comme ceci :

           struct iovec {                    /* dispersion/assemblage
                                                d'éléments de tableaux */
               void *iov_base;               /* Adresse de début */
               size_t iov_len;               /* Nombre d'octets à transférer */
           };

           struct msghdr {
               void         *msg_name;       /* adresse optionnelle */
               socklen_t     msg_namelen;    /* taille de l'adresse */
               struct iovec *msg_iov;        /* tableau scatter/gather */
               size_t        msg_iovlen;     /* # éléments dans msg_iov */
               void         *msg_control;    /* métadonnées, voir ci‐dessous */
               size_t        msg_controllen; /* taille du tampon de métadonnées */
               int           msg_flags;      /* attributs du message reçu */
           };

       Ici  msg_name  et  msg_namelen spécifient l'adresse d'origine si la socket n'est pas connectée ; msg_name
       peut être un pointeur nul si le nom n'est pas nécessaire. msg_iov et msg_iovlen décrivent les tampons  de
       réception  comme  décrit  dans  readv(2).  msg_control,  de longueur msg_controllen, pointe sur un tampon
       utilisé pour les autres messages relatifs au protocole, ou à d'autres données annexes. Lorsqu'on  invoque
       recvmsg,  msg_controllen  doit  contenir la longueur disponible dans le tampon msg_control ; au retour il
       contiendra la longueur de la séquence de message de contrôle.

       Les messages ont la forme

           struct cmsghdr {
               socklen_t     cmsg_len;     /* nombre d'octets de données, y compris l'en-tête */
               int           cmsg_level;   /* protocole d'origine */
               int           cmsg_type;    /* type dépendant du protocole */
           /* suivi de
               unsigned char cmsg_data[]; */
           };

       Les données de service ne doivent être manipulées qu'avec les macros de cmsg(3).

       À titre d'exemple, Linux utilise ce mécanisme pour transmettre des erreurs étendues, des options  IP,  ou
       des descripteurs de fichier sur des sockets de domaine UNIX.

       Le champ msg_flags du msghdr est rempli au retour de recvmsg(). Il peut contenir plusieurs attributs :

       MSG_EOR
              indique  une  fin  d'enregistrement,  les  données  reçues  terminent  un  enregistrement (utilisé
              généralement avec les sockets du type SOCK_SEQPACKET).

       MSG_TRUNC
              indique que la portion finale du datagramme a été abandonnée car le  datagramme  était  trop  long
              pour le tampon fourni.

       MSG_CTRUNC
              indique  que  des  données  de  contrôle  ont été abandonnées à cause d'un manque de place dans le
              tampon de données annexes.

       MSG_OOB
              indique que des données hors-bande ont été reçues.

       MSG_ERRQUEUE
              indique qu'aucune donnée n'a été reçue, sauf une erreur étendue depuis la file d'erreurs.

VALEUR RENVOYÉE

       Ces fonctions renvoient le nombre d'octets reçus si elles réussissent, ou -1 si elles échouent.  Dans  ce
       dernier  cas,  errno permettra d'identifier la cause de l'erreur. La valeur de retour sera 0 si le pair a
       effectué un arrêt normal.

ERREURS

       Il y a des erreurs standards déclenchées par le niveau socket, et des erreurs supplémentaires spécifiques
       aux protocoles. Consultez leurs pages de manuel.

       EAGAIN ou EWOULDBLOCK
              La  socket  est  non  bloquante  et  aucune  donnée n'est disponible, ou un délai de timeout a été
              indiqué, et il a expiré sans que l'on ait reçu quoi que ce soit. 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 paramètre sockfd n'est pas un descripteur correct.

       ECONNREFUSED
              Un hôte distant a refusé la connexion réseau (généralement parce  qu'il  n'offre  pas  le  service
              demandé).

       EFAULT Un tampon pointe en dehors de l'espace d'adressage accessible.

       EINTR  Un signal a interrompu la lecture avant que des données soient disponibles ; consultez signal(7).

       EINVAL Un paramètre non valable a été fourni.

       ENOMEM Pas assez de mémoire pour recvmsg().

       ENOTCONN
              La socket est associée à un protocole orienté connexion et n'a pas encore été connectée (consultez
              connect(2) et accept(2)).

       ENOTSOCK
              Le paramètre sockfd ne correspond pas à une socket.

CONFORMITÉ

       BSD 4.4 (ces fonctions sont apparues dans BSD 4.2), POSIX.1-2001.

       POSIX.1-2001 décrit seulement les drapeaux MSG_OOB, MSG_PEEK, et MSG_WAITALL.

NOTES

       Les prototypes fournis concernent la glibc 2. Les Spécifications Single UNIX  les  définissent,  mais  le
       type  de  retour est ssize_t (alors que BSD 4.x, libc4 , et libc5 renvoient un int). L'argument flags est
       un int dans BSD 4.x, mais unsigned int dans libc4 et libc5. L'argument len est un int dans BSD 4.x,  mais
       un  size_t  dans  libc4  et  libc5.  L'argument  addrlen  est  un  int * dans BSD 4.x, libc4 et libc5. Le
       socklen_t * actuel a été inventé par POSIX. Consultez également accept(2).

       Selon POSIX.1-2001, le champ msg_controllen de la structure msghdr devrait être de type  socklen_t,  mais
       il a actuellement le type size_t dans la glibc.

       Consultez  recvmmsg(2)  pour  plus d'nformations au sujet d'un appel système propre à Linux, utilisé pour
       recevoir des datagrammes multiples avec un unique appel.

EXEMPLE

       Un exemple d'utilisation de recvfrom() se trouve dans la page de manuel de getaddrinfo(3).

VOIR AUSSI

       fcntl(2), getsockopt(2), read(2), recvmmsg(2), select(2), shutdown(2), socket(2), cmsg(3), sockatmark(3),
       socket(7)

COLOPHON

       Cette page fait partie de la publication 3.57 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> ».