dwww Home | Manual pages | Find package

send(2)                       System Calls Manual                      send(2)

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 trans-
       mettre 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 lon-
       gueur 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 confir-
              mation, 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'en-
              voyer 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 so-
              ckets par paquets.

       MSG_DONTWAIT (depuis Linux 2.2)
              Activer une opération non bloquante ; si l'opération bloque, EA-
              GAIN ou EWOULDBLOCK sera renvoyé. Cela donne un comportement si-
              milaire à 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 pro-
              cessus  détenant  des  descripteurs  de  fichier auquels se rap-
              portent 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 uti-
              lisé 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  so-
              ckets  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 ef-
              fectué 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 sigac-
              tion(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éali-
              sant 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 ren-
              voie le nombre d'octets mis en tampon et envoie le  paquet  SYN.
              Si  le cookie n'est pas disponible localement, elle renvoie EIN-
              PROGRESS 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 sui-
       vante :

           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 respecti-
       vement valoir NULL et 0.

       Les  champs msg_iov et msg_iovlen précisent les emplacements de disper-
       sion-regroupement (scatter-gather), de la  même  façon  que  pour  wri-
       tev(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'in-
       formations  sur l'utilisation des données de service dans plusieurs do-
       maines 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  er-
       reurs  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_resolu-
              tion(7)).

              (Pour les sockets UDP) L'envoi à une adresse réseau ou de diffu-
              sion 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  explica-
              tions   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  cor-
              respondant n'a été positionnée.

       EFAULT Un  paramètre  pointe  en  dehors de l'espace d'adressage acces-
              sible.

       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 destina-
              taire a été spécifié. (Maintenant, soit cette  erreur  est  ren-
              voyé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  in-
              dique  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 so-
              cket.

       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. PO-
       SIX.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 de-
       vrait ê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 sys-
       tè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  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.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.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>,  Cédric Boutillier <ce-
       dric.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⟩.

Pages du manuel de Linux 6.03   4 décembre 2022                        send(2)

Generated by dwww version 1.15 on Sat Jun 29 00:27:47 CEST 2024.