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

NOM

       sendmmsg - Envoyer plusieurs messages sur un socket

BIBLIOTHÈQUE

       Bibliothèque C standard (libc, -lc)

SYNOPSIS

       #define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
       #include <sys/socket.h>

       int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
                    int flags);

DESCRIPTION

       L'appel  système  sendmmsg()  est  une  extension de sendmsg(2) qui permet à l'appelant de
       transmettre plusieurs messages sur un socket en utilisant un  seul  appel  système.  (Cela
       améliore les performances pour certaines applications.)

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

       L'argument  msgvec  est un pointeur vers un tableau de structures mmsghdr. La taille de ce
       tableau est précisée dans vlen.

       La structure mmsghdr est définie dans <sys/socket.h> comme ceci :

           struct mmsghdr {
               struct msghdr msg_hdr;  /* En-tête du message  */
               unsigned int  msg_len;  /* Nombre d'octets transmis */
           };

       Le champ msg_hdr est une structure msghdr, conformément à sendmsg(2). Le champ msg_len est
       le  nombre  d'octets  envoyés  du  message  dans msg_hdr. Ce champ a la même valeur que la
       valeur de retour de la simple commande sendmsg(2).

       L'argument flags contient le OU binaire de la collection des attributs. Les attributs sont
       ceux documentés pour sendmsg(2).

       Un  appel  bloquant  sendmmsg()  bloque jusqu'à ce que vlen messages aient été envoyés. Un
       appel non bloquant envoie autant de messages que possible (jusqu'à la limite indiquée  par
       vlen) et renvoie immédiatement.

       Au  renvoi  de sendmmsg(), les champs msg_len des éléments successifs de msgvec sont mis à
       jour pour contenir le nombre d'octets transmis depuis le msg_hdr correspondant. La  valeur
       de renvoi de l'appel indique le nombre d'éléments de msgvec mis à jour.

VALEUR RENVOYÉE

       En  cas  du succès, sendmmsg() renvoie le nombre de messages envoyés depuis msgvec ; si ce
       nombre est strictement inférieur à vlen, l'appelant peut réessayer avec  un  nouvel  appel
       sendmmsg() pour envoyer les messages restants.

       En cas d'erreur, la valeur de retour est -1 et errno est définie pour préciser l'erreur.

ERREURS

       Les  erreurs  sont  les  mêmes que pour sendmsg(2). Une erreur n'est renvoyée que si aucun
       datagramme n'a pu être envoyé. Voir aussi BOGUES.

VERSIONS

       L'appel système sendmmsg() a été ajouté dans Linux 3.0. La prise en charge dans la glibc a
       été ajoutée dans Linux 2.14.

STANDARDS

       sendmmsg() est spécifique à Linux.

NOTES

       La valeur indiquée dans vlen ne peut pas dépasser UIO_MAXIOV (1024).

BOGUES

       Si  une  erreur  se  produit après qu'au moins un message a été envoyé, l'appel réussit et
       renvoie le nombre de messages  envoyés.  Le  code  d'erreur  est  perdu.  L'appelant  peut
       réessayer  le  transfert  à partir du premier message échoué mais rien ne garantit que, si
       une erreur est renvoyée, il s'agira de la même que celle perdue lors du précédent appel.

EXEMPLES

       L'exemple ci-dessous utilise sendmmsg() pour envoyer undeux et trois dans deux datagrammes
       UDP  distincts  en  utilisant un seul appel système. Les contenus des premiers datagrammes
       proviennent d'une paire de tampons.

       #define _GNU_SOURCE
       #include <arpa/inet.h>
       #include <netinet/in.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/socket.h>
       #include <sys/types.h>

       int
       main(void)
       {
           int                 retval;
           int                 sockfd;
           struct iovec        msg1[2], msg2;
           struct mmsghdr      msg[2];
           struct sockaddr_in  addr;

           sockfd = socket(AF_INET, SOCK_DGRAM, 0);
           if (sockfd == -1) {
               perror("socket()");
               exit(EXIT_FAILURE);
           }

           addr.sin_family = AF_INET;
           addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
           addr.sin_port = htons(1234);
           if (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) == -1) {
               perror("connect()");
               exit(EXIT_FAILURE);
           }

           memset(msg1, 0, sizeof(msg1));
           msg1[0].iov_base = "un";
           msg1[0].iov_len = 3;
           msg1[1].iov_base = "deux";
           msg1[1].iov_len = 3;

           memset(&msg2, 0, sizeof(msg2));
           msg2.iov_base = "trois";
           msg2.iov_len = 5;

           memset(msg, 0, sizeof(msg));
           msg[0].msg_hdr.msg_iov = msg1;
           msg[0].msg_hdr.msg_iovlen = 2;

           msg[1].msg_hdr.msg_iov = &msg2;
           msg[1].msg_hdr.msg_iovlen = 1;

           resultat = sendmmsg(sockfd, msg, 2, 0);
           if (resultat == -1)
               perror("sendmmsg()");
           else
               printf("%d messages envoyés\n", resultat);

           exit(0);
       }

VOIR AUSSI

       recvmmsg(2), sendmsg(2), socket(2), socket(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⟩.