Provided by: manpages-fr-dev_4.21.0-2_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 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                                     sendmmsg(2)