SEND
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
CONFORMITÉ
NOTE
VOIR AUSSI
TRADUCTION
NOM
send, sendto, sendmsg - Envoyer un message sur une socket.
SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>
int send(int s, const void *msg, size_t len,
int flags);
int sendto(int s, const void *msg, size_t len,
int flags, const struct sockaddr *to, socklen_t tolen);
int sendmsg(int s, const struct msghdr *msg,
int flags);
DESCRIPTION
Send,
sendto,
et
sendmsg
permettent de transmettre un message à destination d'une
autre socket.
Send
ne peut être utilisé qu'avec les sockets
connectées
alors que
sendto
et
sendmsg
peuvent être utilisés tout le temps.
L'adresse de la cible est donnée par
to
avec la longueur
tolen.
la longueur du message est indiquée dans
len.
Si le message est trop long pour être transmis intégralement
au protocole sous-jacent, l'erreur
EMSGSIZE
sera déclenchée et rien ne sera émis.
Aucune indication d'échec de distribution n'est
fournie par
send.
Seules les erreurs locales sont détectées, et indiquées
par une valeur de retour -1.
Si la socket ne dispose pas de la place suffisante pour
le message, alors
send
va bloquer, à moins que la socket ait été configurée en mode
d'entrées/sorties non-bloquantes auquel cas elle renverra
EAGAIN.
On peut utiliser l'appel système
select(2)
pour vérifier s'il est possible d'émettre des données.
Le paramètre
flags
peut contenir une ou plusieurs des options suivantes
- MSG_OOB
-
est utilisée pour émettre des données
hors-bande
sur une socket qui l'autorise (par ex :
SOCK_STREAM).
Le protocole sous-jacent doit également autoriser l'émission
de données
hors-bande.
- MSG_DONTROUTE
-
est utilisé pour empêcher la transmission d'un paquet vers une passerelle,
n'envoyer de données que vers les hôtes directement connectés au réseau.
Ceci n'est normalement employé que par les programmes de diagnostique
ou de routage. Cette option n'est définie que pour les familles de
protocoles employant le routage, pas les sockets par paquets.
- MSG_DONTWAIT
-
active le mode non-bloquant. Une opération qui devrait bloquer renverra
EAGAIN
à la place (Cela peut être également paramétré avec l'option
O_NONBLOCK
de la fonction
F_SETFL
de
fcntl(2)).
- MSG_NOSIGNAL
-
demande de ne pas envoyer de signal
SIGPIPE
d'erreur sur les sockets connectées lorsque le correspondant coupe
la connexion. L'erreur
EPIPE
est toutefois renvoyée.
- MSG_CONFIRM (Depuis Linux 2.3)
-
Indiquer à la couche de liaison qu'une réponse correcte a été reçue du
correspondant. Si la couche de liaison n'a pas cette confirmation, elle
va ré-interroger régulièrement le voisinage (par exemple avec un ARP unicast).
Seulement valide pour les sockets
SOCK_DGRAM
et
SOCK_RAW
et uniquement implémenté pour IPv4 et IPv6. Voir
arp(7)
pour plus de détails.
La définition de la structure
msghdr
se trouve ci-dessous. Voir
recv(2)
pour une description exacte de ses champs.
-
-
struct msghdr {
void * msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec * msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void * msg_control; /* ancillary data, see below */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
On peut transmettre des informations de service en employant les membres
msg_control
et
msg_controllen.
La longueur maximale du buffer de service que le noyau peut gérer est limité
par socket par la valeur
net.core.optmem_max
de sysctl(). Voir
socket(7).
VALEUR RENVOYÉE
Ces appels systèmes renvoient le nombre de caractères
émis, ou -1 s'ils échouent, auquel cas
errno
contient le code d'erreur.
ERREURS
Voici les erreurs standards engendrés par la couche socket. Des erreurs
supplémentaires peuvent être déclenchées par les protocoles sous-jacents.
Voir leurs pages de manuel respectives.
- EBADF
-
Descripteur de socket invalide.
- ENOTSOCK
-
L'argument
s
n'est pas une socket.
- EFAULT
-
Un paramètre pointe en dehors de l'espace d'adressage accessible.
- EMSGSIZE
-
La socket nécessite une émission intégrale du message mais la taille
de celui-ci ne le permet pas.
- EAGAIN ou EWOULDBLOCK
-
La socket est non-bloquante et l'opération demandée bloquerait.
- ENOBUFS
-
La file d'émission de l'interface réseau est pleine. Ceci
indique généralement une panne de l'interface réseau, mais
peut également être dû à un engorgement passager. Ceci ne doit
pas se produire sous Linux, les paquets sont silencieusement éliminés.
- EINTR
-
Un signal a été reçu.
- ENOMEM
-
Pas assez de mémoire pour le noyau.
- EINVAL
-
Un argument invalide a été transmis.
- EPIPE
-
L'écriture est impossible (correspondant absent). Dans ce cas le processus
recevra également un signal
SIGPIPE
sauf s'il a activée l'option
MSG_NOSIGNAL.
CONFORMITÉ
BSD 4.4 (cet appel système est apparu dans BSD 4.2), SVr4,
Draft POSIX 1003.1g.
MSG_CONFIRM
est une extension Linux.
NOTE
Les prototypes fournis plus haut suivent les Spécifications Single Unix,
tout comme glibc2. L'argument
flags
était un `int' dans BSD 4.*, mais `unsigned int' dans libc4 et libc5.
L'argument
len
était un `int' dans BSD 4.* et libc4, mais un `size_t' dans libc5;
L'argument
tolen
était un `int' dans BSD 4.*, libc4 et libc5.
Voir aussi les notes accompagnant la page
accept(2).
VOIR AUSSI
fcntl(2),
recv(2),
select(2),
getsockopt(2),
sendfile(2),
socket(2),
write(2),
socket(7),
ip(7),
tcp(7),
udp(7)
TRADUCTION
Christophe Blaess, 1996-2003.
|