Provided by: manpages-fr-dev_4.19.0-7_all bug

NOM

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

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #include <sys/socket.h>

       ssize_t send(int sockfd, const void buf[.len], size_t len, int flags);
       ssize_t sendto(int sockfd, const void buf[.len], 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.

       MSG_FASTOPEN (depuis Linux 3.7)
              Tenter TCP Fast Open (RFC7413) et  envoyer  les  données  dans  le  SYN  comme  une
              combinaison  de  connect(2)  et  write(2),  en  réalisant  une opération connect(2)
              implicite. L'option bloque jusqu'à ce que les données soient  mises  en  tampon  et
              l'opération de connexion soit achevée. Pour un socket non bloquant, elle renvoie le
              nombre d'octets mis en tampon et envoie le paquet  SYN.  Si  le  cookie  n'est  pas
              disponible  localement,  elle  renvoie EINPROGRESS et envoie automatiquement un SYN
              avec une requête de cookie Fast Open. L'appelant a besoin d'écrire  à  nouveau  les
              données  quand  le socket est connecté. En cas d'erreur, elle définit le même errno
              que  connect(2)  si  l'opération  de  connexion  échoue.  Cet   attribut   requiert
              l'activation  de  la  prise  en  charge  du  client  TCP  Fast  Open dans le sysctl
              net.ipv4.tcp_fastopen.

              Consulter l'option de socket TCP_FASTOPEN_CONNECT dans  tcp(7)  pour  une  approche
              alternative.

   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  de réussite, ces appels renvoient le nombre d'octets envoyés. En cas d'erreur, -1
       est renvoyé et errno est positionné pour indiquer l'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 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.

STANDARDS

       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)

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⟩.