send(2) System Calls Manual send(2) NOM send, sendto, sendmsg - Envoyer un message sur un socket BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include ssize_t send(int sockfd, const void buf[.len], size_t len, int flags); ssize_t sendto(int sockfd, const void buf[.len], size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags); DESCRIPTION Les appels systeme send(), sendto() et sendmsg() permettent de transmettre un message a destination d'un autre socket. L'appel send() ne peut etre utilise qu'avec les sockets connectes (ainsi, le destinataire vise est connu). La seule difference entre send() et write(2) est la presence de flags. Si flags est nul, send() est equivalent a write(2). De plus l'appel suivant : send(sockfd, buf, len, flags); est equivalent a : sendto(sockfd, buf, len, flags, NULL, 0); Le parametre sockfd est le descripteur de fichier du socket emetteur. Si sendto() est utilisee sur un socket en mode connexion (SOCK_STREAM, SOCK_SEQPACKET), les parametres dest_addr et addrlen sont ignores (et l'erreur EISCONN peut etre renvoyee s'ils ne sont pas NULL ou 0), et l'erreur ENOTCONN est renvoyee lorsque le socket n'est pas vraiment connecte. Autrement, l'adresse de la cible est fournie par dest_addr, addrlen specifiant sa taille. Pour sendmsg(), l'adresse de la cible est fournie par msg.msg_name, msg.msg_namelen specifiant sa taille. Pour send() et sendto(), le message se trouve dans buf et a pour longueur len. Pour sendmsg(), le message est pointe par les elements du tableau msg.msg_iov. L'appel sendmsg() permet egalement l'envoi de metadonnees (egalement appelees donnees de controle). Si le message est trop long pour etre transmis integralement par le protocole sous-jacent, l'erreur EMSGSIZE sera declenchee et rien ne sera emis. Aucune indication d'echec de distribution n'est fournie par send(). Seules les erreurs locales sont detectees et indiquees par une valeur de retour -1. Si le tampon d'envoi du socket ne dispose pas de la place suffisante pour le message, alors send() va bloquer, a moins que le socket ait ete configure en mode d'entrees-sorties non bloquantes auquel cas elle echouera avec l'erreur EAGAIN ou EWOULDBLOCK. On peut utiliser l'appel systeme select(2) pour verifier s'il est possible d'emettre plus de donnees. Le parametre des attributs Le parametre flags est un OU bit a bit de zero ou plusieurs des options suivantes : MSG_CONFIRM (depuis Linux 2.3.15) Indiquer a la couche liaison qu'une reponse correcte a ete recue du correspondant. Si la couche de liaison n'a pas cette confirmation, elle va reinterroger regulierement le voisinage (par exemple avec un ARP unicast). Seulement valable pour les sockets SOCK_DGRAM et SOCK_RAW et uniquement implemente pour IPv4 et IPv6. Consultez arp(7) pour plus de details. MSG_DONTROUTE Ne pas utiliser de passerelle pour transmettre le paquet, n'envoyer de donnees que vers les hotes sur des reseaux directement connectes. Cela n'est normalement employe que par les programmes de diagnostic ou de routage. Cette option n'est definie que pour les familles de protocoles employant le routage, pas par les sockets par paquets. MSG_DONTWAIT (depuis Linux 2.2) Activer une operation non bloquante ; si l'operation bloque, EAGAIN ou EWOULDBLOCK sera renvoye. Cela donne un comportement similaire a la definition de l'attribut O_NONBLOCK (a l'aide de l'operation F_SETFL de fcntl(2)), sauf que MSG_DONTWAIT est une operation par appel tandis que O_NONBLOCK est un parametre de description de fichier ouvert (voir open(2)), ce qui touchera tous les threads du processus appelant ainsi que les autres processus detenant des descripteurs de fichier auquels se rapportent les descriptions de fichier ouvert. MSG_EOR (depuis Linux 2.2) Termine un enregistrement (lorsque cette notion est supportee, comme pour les sockets de type SOCK_SEQPACKET). MSG_MORE (depuis Linux 2.4.4) L'appelant a d'autres donnees a envoyer. Cet attribut est utilise avec les sockets TCP pour obtenir le meme comportement qu'avec l'option de socket TCP_CORK (consultez tcp(7)), a la difference que cet attribut peut etre positionne par appel. Depuis Linux 2.6, cet attribut est egalement gere pour les sockets UDP et demande au noyau d'empaqueter toutes les donnees envoyees dans des appels avec cet attribut positionne dans un seul datagramme qui ne sera transmis que quand un appel sera effectue sans cet attribut. Consultez aussi la description de l'option de socket UDP_CORK dans udp(7). MSG_NOSIGNAL (depuis Linux 2.2) Ne pas generer de signal SIGPIPE si le pair d'un socket oriente flux a ferme la connexion. L'erreur EPIPE est encore renvoyee. Cela donne un comportement identique a l'utilisation de sigaction(2) pour ignorer SIGPIPE, mais alors que MSG_NOSIGNAL est une fonction par appel, ignorer SIGPIPE positionne l'attribut d'un processus qui concerne tous les threads du processus. MSG_OOB est utilisee pour emettre des donnees hors-bande sur un socket qui l'autorise (par exemple de type SOCK_STREAM). Le protocole sous-jacent doit egalement autoriser l'emission de donnees hors-bande. MSG_FASTOPEN (depuis Linux 3.7) Tenter TCP Fast Open (RFC7413) et envoyer les donnees dans le SYN comme une combinaison de connect(2) et write(2), en realisant une operation connect(2) implicite. L'option bloque jusqu'a ce que les donnees soient mises en tampon et l'operation de connexion soit achevee. Pour un socket non bloquant, elle renvoie le nombre d'octets mis en tampon et envoie le paquet SYN. Si le cookie n'est pas disponible localement, elle renvoie EINPROGRESS et envoie automatiquement un SYN avec une requete de cookie Fast Open. L'appelant a besoin d'ecrire a nouveau les donnees quand le socket est connecte. En cas d'erreur, elle definit le meme errno que connect(2) si l'operation de connexion echoue. Cet attribut requiert l'activation de la prise en charge du client TCP Fast Open dans le sysctl net.ipv4.tcp_fastopen. Consulter l'option de socket TCP_FASTOPEN_CONNECT dans tcp(7) pour une approche alternative. sendmsg() La definition de la structure msghdr employee par sendmsg() est la suivante : struct msghdr { void *msg_name; /* Adresse facultative */ socklen_t msg_namelen; /* Taille de l'adresse */ struct iovec *msg_iov; /* Tableau scatter/gather */ size_t msg_iovlen; /* # elements dans msg_iov */ void *msg_control; /* Donnees de service, voir ci-dessous */ size_t msg_controllen; /* Longueur du tampon de donnees de service */ int msg_flags; /* Attributs (inusite) */ }; Le champ msg_name est utilise pour preciser a un socket non connecte l'adresse cible pour un datagramme. Il pointe vers un tampon contenant cette adresse ; le champ msg_namelen doit contenir la taille de cette adresse. Dans le cas d'un socket connecte, ces champs doivent respectivement valoir NULL et 0. Les champs msg_iov et msg_iovlen precisent les emplacements de dispersion-regroupement (scatter-gather), de la meme facon que pour writev(2). On peut transmettre des informations de service en employant les membres msg_control et msg_controllen. La longueur maximale du tampon de service que le noyau peut gerer est limitee par socket par la valeur de /proc/sys/net/core/optmem_max. Consultez socket(7). Pour plus d'informations sur l'utilisation des donnees de service dans plusieurs domaines de socket, voir unix(7) et ip(7). Le champ msg_flags est ignore. VALEUR RENVOYEE En cas de reussite, ces appels renvoient le nombre d'octets envoyes. En cas d'erreur, -1 est renvoye et errno est positionne pour indiquer l'erreur. ERREURS Voici les erreurs standards engendrees par la couche socket. Des erreurs supplementaires peuvent etre declenchees par les protocoles sous-jacents. Consultez leurs pages de manuel respectives. EACCES (Pour les sockets de domaine UNIX qui sont identifies par un nom de chemin) La permission d'ecriture est refusee sur le fichier socket de destination ou la permission de parcours est refusee pour un des repertoires du chemin (consultez path_resolution(7)). (Pour les sockets UDP) L'envoi a une adresse reseau ou de diffusion a ete tente, alors qu'il s'agissait d'une adresse unicast. EAGAIN ou EWOULDBLOCK Le socket est non bloquant et l'operation demandee devrait etre bloquante. POSIX.1-2001 permet de renvoyer l'une ou l'autre des erreurs dans ce cas et n'exige pas que ces constantes aient la meme valeur. Une application portable devrait donc tester les deux possibilites. EAGAIN (Sockets de datagramme Internet) Le socket indique par sockfd n'a pas encore ete attache a une adresse et lors d'une tentative d'attachement a un port ephemere, aucun port n'etait disponible dans l'intervalle des ports ephemeres. Consultez les explications concernant /proc/sys/net/ipv4/ip_local_port_range dans ip(7). EALREADY Un autre Fast Open est en cours. EBADF sockfd n'est pas un descripteur de fichier valable. ECONNRESET Connexion reinitialisee par le correspondant. EDESTADDRREQ Le socket n'est pas en mode connexion et aucune adresse de correspondant n'a ete positionnee. EFAULT Un parametre pointe en dehors de l'espace d'adressage accessible. EINTR Un signal a ete recu avant que la moindre donnee n'ait ete transmise ; voir signal(7). EINVAL Un parametre non valable a ete fourni. EISCONN Le socket en mode connexion est deja connecte mais un destinataire a ete specifie. (Maintenant, soit cette erreur est renvoyee, soit la specification du destinataire est ignoree.) EMSGSIZE Le type de socket necessite l'emission integrale du message mais la taille de celui-ci ne le permet pas. ENOBUFS La file d'emission de l'interface reseau est pleine. Cela indique generalement une panne de l'interface reseau, mais peut egalement etre du a un engorgement passager. Cela ne doit pas se produire sous Linux, les paquets sont silencieusement elimines. ENOMEM Pas assez de memoire pour le noyau. ENOTCONN Le socket n'est pas connecte et aucune cible n'a ete fournie. ENOTSOCK Le descripteur de fichier sockfd ne fait pas reference a un socket. EOPNOTSUPP Au moins un bit de l'argument flags n'est pas approprie pour le type de socket. EPIPE L'ecriture a ete terminee du cote local sur un socket oriente connexion. Dans ce cas, le processus recevra egalement un signal SIGPIPE sauf s'il a active l'option MSG_NOSIGNAL. VERSIONS Selon POSIX.1-2001, le champ msg_controllen de la structure msghdr devrait etre de type socklen_t et le champ msg_iovlen devrait etre de type int, mais les deux sont actuellement de type size_t dans la glibc. STANDARDS POSIX.1-2008. MSG_CONFIRM est une extension Linux HISTORIQUE 4.4BSD, SVr4, POSIX.1-2001. (Apparus dans 4.2BSD). POSIX.1-2001 decrit seulement les drapeaux MSG_OOB et MSG_EOR. POSIX.1-2008 ajoute la specification de MSG_NOSIGNAL. NOTES Consultez sendmmsg(2) pour plus d'informations au sujet d'un appel systeme propre a Linux, utilise pour transmettre des datagrammes multiples avec un unique appel. BOGUES Linux peut renvoyer EPIPE au lieu de ENOTCONN. EXEMPLES Un exemple d'utilisation de sendto() se trouve dans la page de manuel de getaddrinfo(3). VOIR AUSSI fcntl(2), getsockopt(2), recv(2), select(2), sendfile(2), sendmmsg(2), shutdown(2), socket(2), write(2), cmsg(3), ip(7), ipv6(7), socket(7), tcp(7), udp(7), unix(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 send(2)