dwww Home | Manual pages | Find package

sendmmsg(2)                   System Calls Manual                  sendmmsg(2)

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

       L'argument  msgvec  est  un  pointeur vers un tableau de structures mm-
       sghdr. 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 pos-
       sible (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 de-
       puis msgvec ; si ce nombre est strictement inférieur à vlen, l'appelant
       peut  réessayer  avec  un nouvel appel sendmmsg() pour envoyer les mes-
       sages 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 ren-
       voyé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'er-
       reur est perdu. L'appelant peut réessayer le transfert à partir du pre-
       mier message échoué mais rien ne garantit que, si une erreur  est  ren-
       voyé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 tam-
       pons.

       #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  Chris-
       tophe  Blaess  <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste-
       phan.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.cou-
       lon@wanadoo.fr>,  Julien  Cristau <jcristau@debian.org>, Thomas Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François  <nicolas.francois@centra-
       liens.net>,  Florentin  Duneau <fduneau@gmail.com>, Simon Paillard <si-
       mon.paillard@resel.enst-bretagne.fr>,   Denis   Barbier    <barbier@de-
       bian.org>,  David  Prévot  <david@tilapin.org>,  Cédric Boutillier <ce-
       dric.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⟩.

Pages du manuel de Linux 6.03   4 décembre 2022                    sendmmsg(2)

Generated by dwww version 1.15 on Sat Jun 29 01:45:14 CEST 2024.