Provided by: manpages-fr-dev_3.57d1p1-1_all bug

NOM

       sendmmsg - Envoyer plusieurs message sur une socket

SYNOPSIS

       #define _GNU_SOURCE
       #include <sys/socket.h>

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

DESCRIPTION

       L'appel  système  sendmmsg()  est  une  extension de sendmsg(2) qui permet à l'appelant de
       transmettre plusieurs messages sur une 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 de la 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  du message dans msg_hdr qui ont été envoyés. 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 retourne immédiatement.

       Au  retour  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 retour de l'appel indique le nombre d'éléments de msgvec mis à jour.

VALEUR RENVOYÉE

       En  cas du succès, sendmmsg() retourne 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, -1 est renvoyé 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 retournée seulement si
       aucun datagramme n'a pu être envoyé.

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

EXEMPLE

       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 sa;
           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);
           }

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

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

           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 3.57 du projet man-pages Linux. Une description
       du projet et des  instructions  pour  signaler  des  anomalies  peuvent  être  trouvées  à
       l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis    2010,    cette   traduction   est   maintenue   à   l'aide   de   l'outil   po4a
       <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du  projet
       perkamon <http://perkamon.alioth.debian.org/>.

       Veuillez     signaler     toute     erreur     de     traduction     en     écrivant     à
       <debian-l10n-french@lists.debian.org>  ou  par  un  rapport  de  bogue   sur   le   paquet
       manpages-fr.

       Vous  pouvez  toujours  avoir  accès  à la version anglaise de ce document en utilisant la
       commande « man -L C <section> <page_de_man> ».