1. NOM▲
sendmmsg - Envoyer plusieurs message sur une socket
2. SYNOPSIS ▲
#define _GNU_SOURCE
#include <sys/socket.h>
int
sendmmsg
(
int
sockfd, struct
mmsghdr *
msgvec, unsigned
int
vlen,
unsigned
int
flags);
3. 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.
4. 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.
5. 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é.
6. 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.
7. CONFORMITÉ ▲
sendmmsg() est spécifique à Linux.
8. NOTES ▲
La valeur indiquée dans vlen ne peut pas dépasser UIO_MAXIOV (1024).
9. 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
);
}
10. VOIR AUSSI ▲
11. COLOPHON ▲
Cette page fait partie de la publication 3.52 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/.
12. 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 à <>.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».