Manpages

NOM

sendmmsg - Envoyer plusieurs message sur une socket

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 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, la valeur de retour est -1 et errno est définie pour préciser l’erreur.

ERREURS

Errors are as for sendmsg(2). An error is returned only if no datagrams could be sent. See also BUGS.

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

BOGUES

If an error occurs after at least one message has been sent, the call succeeds, and returns the number of messages sent. The error code is lost. The caller can retry the transmission, starting at the first failed message, but there is no guarantee that, if an error is returned, it will be the same as the one that was lost on the previous call.

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 <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 addr;
    struct mmsghdr msg[2];
    struct iovec msg1[2], msg2;
    int retval;

    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 = 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 5.07 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies et la dernière version de cette page, peuvent être trouvées à l’adresse https://www.kernel.org/doc/man-pages/.

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 [AT] laposte.net>, Thierry Vignaud <tvignaud [AT] mandriva.com>, François Micaux, Alain Portal <aportal [AT] univ-montp2.fr>, Jean-Philippe Guérard <fevrier [AT] tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon [AT] wanadoo.fr>, Julien Cristau <jcristau [AT] debian.org>, Thomas Huriaux <thomas.huriaux [AT] gmail.com>, Nicolas François <nicolas.francois [AT] centraliens.net>, Florentin Duneau <fduneau [AT] gmail.com>, Simon Paillard <simon.paillard [AT] resel.fr>, Denis Barbier <barbier [AT] debian.org>, David Prévot <david [AT] tilapin.org>, Cédric Boutillier <cedric.boutillier [AT] gmail.com> et Frédéric Hantrais <fhantrais [AT] gmail.com>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 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 [AT] lists.org>.