Provided by: manpages-fr-dev_4.23.1-1_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.

STANDARDS

       Linux.

HISTORIQUE

       Linux 3.0, glibc 2.14.

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;

           retval = sendmmsg(sockfd, msg, 2, 0);
           if (retval == -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⟩.