#define _GNU_SOURCE /* Consultez feature_test_macros(7) */ #include <sys/socket.h> int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags);
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.
En cas d'erreur, la valeur de retour est -1 et errno est définie pour préciser l'erreur.
#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\n", resultat);
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 à