oracular (2) sendmmsg.2.gz

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