NOM¶
sendmmsg - Envoyer plusieurs message sur une socket
SYNOPSIS¶
#define _GNU_SOURCE
#include <sys/socket.h>
int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen,
unsigned 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, -1 est renvoyé 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
retournée seulement si aucun datagramme n'a pu être
envoyé.
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.
sendmmsg() est spécifique à Linux.
NOTES¶
La valeur indiquée dans
vlen ne peut pas dépasser
UIO_MAXIOV (1024).
EXEMPLE¶
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 sa;
struct mmsghdr msg[2];
struct iovec msg1[2], msg2;
int resultat;
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == -1) {
perror("socket()");
exit(EXIT_FAILURE);
}
sa.sin_family = AF_INET;
sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
sa.sin_port = htons(1234);
if (connect(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -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 3.65 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce
document en utilisant la commande «
man -L C
<section>
<page_de_man> ».