sendmmsg(2) System Calls Manual sendmmsg(2) 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 destina- taire. L'argument msgvec est un pointeur vers un tableau de structures mm- sghdr. 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 pos- sible (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 de- puis msgvec ; si ce nombre est strictement inférieur à vlen, l'appelant peut réessayer avec un nouvel appel sendmmsg() pour envoyer les mes- sages 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 ren- voyée que si aucun datagramme n'a pu être envoyé. Voir aussi BOGUES. 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 Linux 2.14. STANDARDS sendmmsg() est spécifique à Linux. 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'er- reur est perdu. L'appelant peut réessayer le transfert à partir du pre- mier message échoué mais rien ne garantit que, si une erreur est ren- voyé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 tam- pons. #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); 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 Chris- tophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <ste- phan.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.cou- lon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centra- liens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <si- mon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@de- bian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <ce- dric.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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩. Pages du manuel de Linux 6.03 4 décembre 2022 sendmmsg(2)
Generated by dwww version 1.15 on Sat Jun 29 01:45:14 CEST 2024.