.\" -*- coding: UTF-8 -*-
.\" Copyright (c) 2012 by Michael Kerrisk <mtk.manpages@gmail.com>
.\" with some material from a draft by
.\" Stephan Mueller <stephan.mueller@atsec.com>
.\" in turn based on Andi Kleen's recvmmsg.2 page.
.\"
.\" SPDX-License-Identifier: Linux-man-pages-copyleft
.\"
.\"*******************************************************************
.\"
.\" This file was generated with po4a. Translate the source file.
.\"
.\"*******************************************************************
.TH sendmmsg 2 "4 décembre 2022" "Pages du manuel de Linux 6.03" 
.SH NOM
sendmmsg \- Envoyer plusieurs messages sur un socket
.SH BIBLIOTHÈQUE
Bibliothèque C standard (\fIlibc\fP, \fI\-lc\fP)
.SH SYNOPSIS
.nf
\fB#define _GNU_SOURCE\fP         /* Consultez feature_test_macros(7) */
\fB#include <sys/socket.h>\fP
.PP
\fBint sendmmsg(int \fP\fIsockfd\fP\fB, struct mmsghdr *\fP\fImsgvec\fP\fB, unsigned int \fP\fIvlen\fP\fB,\fP
\fB             int \fP\fIflags\fP\fB);\fP
.fi
.SH DESCRIPTION
.\" See commit 228e548e602061b08ee8e8966f567c12aa079682
L'appel système \fBsendmmsg\fP() est une extension de \fBsendmsg\fP(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.)
.PP
Le paramètre \fIsockfd\fP est le descripteur de fichier du socket destinataire.
.PP
L'argument \fImsgvec\fP est un pointeur vers un tableau de structures
\fImmsghdr\fP. La taille de ce tableau est précisée dans \fIvlen\fP.
.PP
La structure \fImmsghdr\fP est définie dans \fI<sys/socket.h>\fP comme
ceci\ :
.PP
.in +4n
.EX
struct mmsghdr {
    struct msghdr msg_hdr;  /* En\-tête du message  */
    unsigned int  msg_len;  /* Nombre d'octets transmis */
};
.EE
.in
.PP
Le champ \fImsg_hdr\fP est une structure \fImsghdr\fP, conformément à
\fBsendmsg\fP(2). Le champ \fImsg_len\fP est le nombre d'octets envoyés du message
dans \fImsg_hdr\fP. Ce champ a la même valeur que la valeur de retour de la
simple commande \fBsendmsg\fP(2).
.PP
L'argument \fIflags\fP contient le OU binaire de la collection des
attributs. Les attributs sont ceux documentés pour \fBsendmsg\fP(2).
.PP
Un appel bloquant \fBsendmmsg\fP() bloque jusqu'à ce que \fIvlen\fP messages aient
été envoyés. Un appel non bloquant envoie autant de messages que possible
(jusqu'à la limite indiquée par \fIvlen\fP) et renvoie immédiatement.
.PP
Au renvoi de \fBsendmmsg\fP(), les champs \fImsg_len\fP des éléments successifs de
\fImsgvec\fP sont mis à jour pour contenir le nombre d'octets transmis depuis
le \fImsg_hdr\fP correspondant. La valeur de renvoi de l'appel indique le
nombre d'éléments de \fImsgvec\fP mis à jour.
.SH "VALEUR RENVOYÉE"
En cas du succès, \fBsendmmsg\fP() renvoie le nombre de messages envoyés depuis
\fImsgvec\fP\ ; si ce nombre est strictement inférieur à \fIvlen\fP, l'appelant
peut réessayer avec un nouvel appel \fBsendmmsg\fP() pour envoyer les messages
restants.
.PP
En cas d'erreur, la valeur de retour est \fB\-1\fP et \fIerrno\fP est définie pour
préciser l'erreur.
.SH ERREURS
.\" commit 728ffb86f10873aaf4abd26dde691ee40ae731fe
.\"     ... only return an error if no datagrams could be sent.
.\"     If less than the requested number of messages were sent, the application
.\"     must retry starting at the first failed one and if the problem is
.\"     persistent the error will be returned.
.\"
.\"     This matches the behavior of other syscalls like read/write - it
.\"     is not an error if less than the requested number of elements are sent.
Les erreurs sont les mêmes que pour \fBsendmsg\fP(2). Une erreur n'est renvoyée
que si aucun datagramme n'a pu être envoyé. Voir aussi BOGUES.
.SH VERSIONS
L'appel système \fBsendmmsg\fP() a été ajouté dans Linux\ 3.0. La prise en
charge dans la glibc a été ajoutée dans Linux\ 2.14.
.SH STANDARDS
\fBsendmmsg\fP() est spécifique à Linux.
.SH NOTES
.\" commit 98382f419f32d2c12d021943b87dea555677144b
.\"     net: Cap number of elements for sendmmsg
.\"
.\"     To limit the amount of time we can spend in sendmmsg, cap the
.\"     number of elements to UIO_MAXIOV (currently 1024).
.\"
.\"     For error handling an application using sendmmsg needs to retry at
.\"     the first unsent message, so capping is simpler and requires less
.\"     application logic than returning EINVAL.
La valeur indiquée dans \fIvlen\fP ne peut pas dépasser \fBUIO_MAXIOV\fP (1024).
.SH 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.
.SH EXEMPLES
L'exemple ci\-dessous utilise \fBsendmmsg\fP() pour envoyer \fIundeux\fP et
\fItrois\fP dans deux datagrammes UDP distincts en utilisant un seul appel
système. Les contenus des premiers datagrammes proviennent d'une paire de
tampons.
.PP
.\" SRC BEGIN (sendmmsg.c)
.EX
#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\en", resultat);

    exit(0);
}
.EE
.\" SRC END
.SH "VOIR AUSSI"
\fBrecvmmsg\fP(2), \fBsendmsg\fP(2), \fBsocket\fP(2), \fBsocket\fP(7)
.PP
.SH 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>
.
.PP
Cette traduction est une documentation libre ; veuillez vous reporter à la
.UR https://www.gnu.org/licenses/gpl-3.0.html
GNU General Public License version 3
.UE
concernant les conditions de copie et 
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
.PP
Si vous découvrez un bogue dans la traduction de cette page de manuel, 
veuillez envoyer un message à
.MT debian-l10n-french@lists.debian.org
.ME .