Man page - sendmmsg(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

sendmmsg

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
BOGUES
EXEMPLES
VOIR AUSSI
TRADUCTION

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