jammy (2) sendmsg.2.gz

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

NOM

       send, sendto, sendmsg - Envoyer un message sur un socket

SYNOPSIS

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

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

       ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
                      const struct sockaddr *dest_addr, socklen_t addrlen);

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

DESCRIPTION

       Les  appels  système  send(), sendto() et sendmsg() permettent de transmettre un message à
       destination d'un autre socket.

       L'appel send() ne peut être utilisé qu'avec les sockets connectés (ainsi, le  destinataire
       visé est connu). La seule différence entre send() et write(2) est la présence de flags. Si
       flags est nul, send() est équivalent à write(2). De plus l'appel suivant :

           send(sockfd, buf, len, flags);

       est équivalent à :

           sendto(sockfd, buf, len, flags, NULL, 0);

       Le paramètre sockfd est le descripteur de fichier du socket émetteur.

       Si sendto() est utilisée sur un socket en mode  connexion  (SOCK_STREAM,  SOCK_SEQPACKET),
       les  paramètres  dest_addr et addrlen sont ignorés (et l'erreur EISCONN peut être renvoyée
       s'ils ne sont pas NULL ou 0), et l'erreur ENOTCONN est renvoyée lorsque  le  socket  n'est
       pas vraiment connecté. Autrement, l'adresse de la cible est fournie par dest_addr, addrlen
       spécifiant sa taille. Pour sendmsg(), l'adresse de la cible est fournie par  msg.msg_name,
       msg.msg_namelen spécifiant sa taille.

       Pour  send()  et  sendto(),  le  message  se  trouve dans buf et a pour longueur len. Pour
       sendmsg(), le message  est  pointé  par  les  éléments  du  tableau  msg.msg_iov.  L'appel
       sendmsg()   permet  également  l'envoi  de  métadonnées  (également  appelées  données  de
       contrôle).

       Si le message est trop long pour être transmis intégralement par le protocole sous‐jacent,
       l'erreur EMSGSIZE sera déclenchée et rien ne sera émis.

       Aucune  indication  d'échec  de  distribution n'est fournie par send(). Seules les erreurs
       locales sont détectées et indiquées par une valeur de retour -1.

       Si le tampon d'envoi du socket ne dispose pas de la  place  suffisante  pour  le  message,
       alors send() va bloquer, à moins que le socket ait été configuré en mode d'entrées-sorties
       non bloquantes auquel cas elle échouera avec  l'erreur  EAGAIN  ou  EWOULDBLOCK.  On  peut
       utiliser  l'appel  système  select(2)  pour  vérifier  s'il est possible d'émettre plus de
       données.

   Le paramètre des attributs
       Le paramètre flags est un OU bit à bit de zéro ou plusieurs des options suivantes :

       MSG_CONFIRM (depuis Linux 2.3.15)
              Indiquer à la couche liaison qu'une réponse correcte a été reçue du  correspondant.
              Si  la  couche  de  liaison  n'a  pas  cette  confirmation,  elle  va  réinterroger
              régulièrement le voisinage (par exemple avec un  ARP  unicast).  Seulement  valable
              pour les sockets SOCK_DGRAM et SOCK_RAW et uniquement implémenté pour IPv4 et IPv6.
              Consultez arp(7) pour plus de détails.

       MSG_DONTROUTE
              Ne pas utiliser de passerelle pour transmettre le paquet, n'envoyer de données  que
              vers  les  hôtes  sur  des  réseaux  directement  connectés. Cela n'est normalement
              employé que par les programmes de diagnostic ou  de  routage.  Cette  option  n'est
              définie  que  pour  les  familles  de  protocoles employant le routage, pas par les
              sockets par paquets.

       MSG_DONTWAIT (depuis Linux 2.2)
              Activer une opération non bloquante ; si l'opération bloque, EAGAIN ou  EWOULDBLOCK
              sera  renvoyé.  Cela  donne un comportement similaire à la définition de l'attribut
              O_NONBLOCK (à l'aide de l'opération F_SETFL de fcntl(2)), sauf que MSG_DONTWAIT est
              une  opération  par  appel tandis que O_NONBLOCK est un paramètre de description de
              fichier ouvert (voir open(2)), ce  qui  touchera  tous  les  threads  du  processus
              appelant  ainsi  que  les  autres  processus  détenant  des descripteurs de fichier
              auquels se rapportent les descriptions de fichier ouvert.

       MSG_EOR (depuis Linux 2.2)
              Termine un enregistrement (lorsque cette  notion  est  supportée,  comme  pour  les
              sockets de type SOCK_SEQPACKET).

       MSG_MORE (depuis Linux 2.4.4)
              L'appelant  a d'autres données à envoyer. Cet attribut est utilisé avec les sockets
              TCP  pour  obtenir  le  même  comportement  qu'avec  l'option  de  socket  TCP_CORK
              (consultez  tcp(7)),  à  la  différence  que  cet attribut peut être positionné par
              appel.

              Depuis Linux 2.6, cet attribut est également géré pour les sockets UDP  et  demande
              au noyau d'empaqueter toutes les données envoyées dans des appels avec cet attribut
              positionné dans un seul datagramme qui ne sera transmis que  quand  un  appel  sera
              effectué  sans  cet  attribut. Consultez aussi la description de l'option de socket
              UDP_CORK dans udp(7).

       MSG_NOSIGNAL (depuis Linux 2.2)
              Ne pas générer de signal SIGPIPE si le pair d'un socket orienté  flux  a  fermé  la
              connexion. L'erreur EPIPE est encore renvoyée. Cela donne un comportement identique
              à l'utilisation de sigaction(2) pour ignorer SIGPIPE, mais alors  que  MSG_NOSIGNAL
              est  une  fonction  par appel, ignorer SIGPIPE positionne l'attribut d'un processus
              qui concerne tous les threads du processus.

       MSG_OOB
              est utilisée pour émettre des données hors‐bande sur un socket qui l'autorise  (par
              exemple  de  type  SOCK_STREAM).  Le protocole sous‐jacent doit également autoriser
              l'émission de données hors‐bande.

   sendmsg()
       La définition de la structure msghdr employée par sendmsg() est la suivante :

           struct msghdr {
               void         *msg_name;       /* Adresse facultative */
               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;    /* Données de service, voir ci-dessous */
               size_t        msg_controllen; /* Longueur du tampon de données de
                                                service */
               int           msg_flags;      /* Attributs (inusité) */
           };

       Le champ msg_name est utilisé pour préciser à un socket non connecté l'adresse cible  pour
       un  datagramme.  Il  pointe  vers un tampon contenant cette adresse ; le champ msg_namelen
       doit contenir la taille de cette adresse. Dans le cas d'un  socket  connecté,  ces  champs
       doivent respectivement valoir NULL et 0.

       Les  champs  msg_iov  et  msg_iovlen précisent les emplacements de dispersion-regroupement
       (scatter-gather), de la même façon que pour writev(2).

       On peut transmettre des informations de service en employant les  membres  msg_control  et
       msg_controllen.  La  longueur  maximale  du  tampon de service que le noyau peut gérer est
       limitée par socket par la valeur de  /proc/sys/net/core/optmem_max.  Consultez  socket(7).
       Pour  plus d'informations sur l'utilisation des données de service dans plusieurs domaines
       de socket, voir unix(7) et ip(7).

       Le champ msg_flags est ignoré.

VALEUR RENVOYÉE

       En cas d'envoi réussi,  ces  fonctions  renvoient  le  nombre  d'octets  envoyés.  En  cas
       d'erreur, -1 est renvoyé, et errno contient le code d'erreur.

ERREURS

       Voici  les  erreurs standards engendrées par la couche socket. Des erreurs supplémentaires
       peuvent être déclenchées par les protocoles sous-jacents. Consultez leurs pages de  manuel
       respectives.

       EACCES (Pour  les  sockets  de  domaine  UNIX qui sont identifiés par un nom de chemin) La
              permission d'écriture est refusée sur  le  fichier  socket  de  destination  ou  la
              permission  de  parcours  est  refusée pour un des répertoires du chemin (consultez
              path_resolution(7)).

              (Pour les sockets UDP) L'envoi à une adresse réseau ou de diffusion  a  été  tenté,
              alors qu'il s'agissait d'une adresse unicast.

       EAGAIN ou EWOULDBLOCK
              Le  socket  est  non  bloquant  et  l'opération  demandée  devrait  être bloquante.
              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.

       EAGAIN (Sockets de datagramme Internet) Le socket indiqué par sockfd n'a  pas  encore  été
              attaché  a  une  adresse  et lors d'une tentative d'attachement à un port éphémère,
              aucun port n'était disponible dans l'intervalle des ports éphémères. Consultez  les
              explications concernant /proc/sys/net/ipv4/ip_local_port_range dans ip(7).

       EALREADY
              Un autre Fast Open est en cours.

       EBADF  sockfd n'est pas un descripteur de fichier ouvert valable.

       ECONNRESET
              Connexion réinitialisée par le correspondant.

       EDESTADDRREQ
              Le  socket  n'est  pas en mode connexion et aucune adresse de correspondant n'a été
              positionnée.

       EFAULT Un paramètre pointe en dehors de l'espace d'adressage accessible.

       EINTR  Un signal a été reçu avant  que  la  moindre  donnée  n'ait  été  transmise ;  voir
              signal(7).

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

       EISCONN
              Le  socket en mode connexion est déjà connecté mais un destinataire a été spécifié.
              (Maintenant, soit cette erreur est renvoyée, soit la spécification du  destinataire
              est ignorée.)

       EMSGSIZE
              Le  type  de  socket  nécessite  l'émission  intégrale du message mais la taille de
              celui-ci ne le permet pas.

       ENOBUFS
              La file d'émission de l'interface réseau est pleine. Cela indique généralement  une
              panne de l'interface réseau, mais peut également être dû à un engorgement passager.
              Cela ne doit pas se produire sous Linux, les paquets sont silencieusement éliminés.

       ENOMEM Pas assez de mémoire pour le noyau.

       ENOTCONN
              Le socket n'est pas connecté et aucune cible n'a été fournie.

       ENOTSOCK
              Le descripteur de fichier sockfd ne fait pas référence à un socket.

       EOPNOTSUPP
              Au moins un bit de l'argument flags n'est pas approprié pour le type de socket.

       EPIPE  L'écriture a été terminée du côté local sur un socket orienté  connexion.  Dans  ce
              cas,  le  processus recevra également un signal SIGPIPE sauf s'il a activé l'option
              MSG_NOSIGNAL.

CONFORMITÉ

       BSD 4.4, SVr4, POSIX.1-2001. Ces interfaces sont apparues dans BSD 4.2.

       POSIX.1-2001 décrit seulement les drapeaux MSG_OOB  et  MSG_EOR.  POSIX.1-2008  ajoute  la
       spécification de MSG_NOSIGNAL. Le drapeau MSG_CONFIRM est une extension Linux.

NOTES

       Selon  POSIX.1-2001,  le  champ msg_controllen de la structure msghdr devrait être de type
       socklen_t et le champ msg_iovlen devrait être de type int, mais les deux sont actuellement
       de type size_t dans la glibc.

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

BOGUES

       Linux peut renvoyer EPIPE au lieu de ENOTCONN.

EXEMPLES

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

VOIR AUSSI

       fcntl(2),  getsockopt(2),  recv(2),  select(2),  sendfile(2),  sendmmsg(2),   shutdown(2),
       socket(2), write(2), cmsg(3), ip(7), ipv6(7), socket(7), tcp(7), udp(7), unix(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  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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 ⟨⟩.