sendmmsg(2) System Calls Manual sendmmsg(2) NOM sendmmsg - Envoyer plusieurs messages sur un socket BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #define _GNU_SOURCE /* Consultez feature_test_macros(7) */ #include int sendmmsg(int sockfd, struct mmsghdr *msgvec, unsigned int vlen, int flags); DESCRIPTION L'appel systeme sendmmsg() est une extension de sendmsg(2) qui permet a l'appelant de transmettre plusieurs messages sur un socket en utilisant un seul appel systeme. (Cela ameliore les performances pour certaines applications.) Le parametre 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 precisee dans vlen. La structure mmsghdr est definie dans comme ceci : struct mmsghdr { struct msghdr msg_hdr; /* En-tete du message */ unsigned int msg_len; /* Nombre d'octets transmis */ }; Le champ msg_hdr est une structure msghdr, conformement a sendmsg(2). Le champ msg_len est le nombre d'octets envoyes du message dans msg_hdr. Ce champ a la meme 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 documentes pour sendmsg(2). Un appel bloquant sendmmsg() bloque jusqu'a ce que vlen messages aient ete envoyes. Un appel non bloquant envoie autant de messages que possible (jusqu'a la limite indiquee par vlen) et renvoie immediatement. Au renvoi de sendmmsg(), les champs msg_len des elements successifs de msgvec sont mis a jour pour contenir le nombre d'octets transmis depuis le msg_hdr correspondant. La valeur de renvoi de l'appel indique le nombre d'elements de msgvec mis a jour. VALEUR RENVOYEE En cas du succes, sendmmsg() renvoie le nombre de messages envoyes depuis msgvec ; si ce nombre est strictement inferieur a vlen, l'appelant peut reessayer avec un nouvel appel sendmmsg() pour envoyer les messages restants. En cas d'erreur, la valeur de retour est -1 et errno est definie pour preciser l'erreur. ERREURS Les erreurs sont les memes que pour sendmsg(2). Une erreur n'est renvoyee que si aucun datagramme n'a pu etre envoye. Voir aussi BOGUES. STANDARDS Linux. HISTORIQUE Linux 3.0, glibc 2.14. NOTES La valeur indiquee dans vlen ne peut pas depasser UIO_MAXIOV (1024). BOGUES Si une erreur se produit apres qu'au moins un message a ete envoye, l'appel reussit et renvoie le nombre de messages envoyes. Le code d'erreur est perdu. L'appelant peut reessayer le transfert a partir du premier message echoue mais rien ne garantit que, si une erreur est renvoyee, il s'agira de la meme que celle perdue lors du precedent appel. EXEMPLES L'exemple ci-dessous utilise sendmmsg() pour envoyer undeux et trois dans deux datagrammes UDP distincts en utilisant un seul appel systeme. Les contenus des premiers datagrammes proviennent d'une paire de tampons. #define _GNU_SOURCE #include #include #include #include #include #include #include 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 envoyes\n", resultat); exit(0); } VOIR AUSSI recvmmsg(2), sendmsg(2), socket(2), socket(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Cedric Boutillier , Frederic Hantrais et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 sendmmsg(2)