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

NOM

       sendmmsg - Envoyer plusieurs messages sur un socket

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 la version 2.14.

CONFORMITÉ

       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 <netinet/ip.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/types.h>
       #include <sys/socket.h>

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

           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)

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

Linux                                              9 juin 2020                                       SENDMMSG(2)