recv, recvfrom, recvmsg
Recevoir un message sur une socket
- Provided by: manpages-fr-dev (Version: 3.65d1p1-1)
- Source: manpages-fr
- Report a bug
Recevoir un message sur une socket
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
Les appels système recv(), recvfrom() et recvmsg() sont utilisés pour recevoir des messages depuis une socket, et peuvent servir sur une socket orientée connexion ou non. Cette page décrit dans un premier temps les fonctionnalités communes de ces trois appels système, puis précise ensuite ce qui les différencie.
Ces trois appels renvoient la longueur du message s'ils réussissent. Si un message est trop long pour tenir dans le tampon, les octets supplémentaires peuvent être abandonnés suivant le type de socket utilisé.
Si aucun message n'est disponible sur la socket, les fonctions de réception se mettent en attente, à moins que la socket soit non bloquante (voir fcntl(2)) auquel cas la valeur -1 est renvoyée, et errno est positionnée à EAGAIN ou EWOULDBLOCK. Les fonctions de réception renvoient normalement les données disponibles sans attendre d'avoir reçu le nombre exact réclamé.
Une application peut avoir recours à select(2), poll(2), ou epoll(7) pour savoir si des données supplémentaires sont disponibles dans la socket.
L'argument flags est constitué d'un OU binaire entre une ou plusieurs des valeurs suivantes :
L'erreur est contenue dans une structure
sock_extended_err :
#define SO_EE_ORIGIN_NONE 0
#define SO_EE_ORIGIN_LOCAL 1
#define SO_EE_ORIGIN_ICMP 2
#define SO_EE_ORIGIN_ICMP6 3
struct sock_extended_err
{
uint32_t ee_errno; /* numéro d'erreur */
uint8_t ee_origin; /* origine de l'erreur */
uint8_t ee_type; /* type */
uint8_t ee_code; /* code */
uint8_t ee_pad; /* remplissage */
uint32_t ee_info; /* données supplémentaires */
uint32_t ee_data; /* autres données */
/* Des données supplémentaires peuvent suivre */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
Pour une utilisation avec des sockets en mode flux, consultez tcp(7).
recvfrom() enregistre le message reçu dans le tampon buf. Le processus appelant doit préciser la taille de ce tampon dans len.
Si src_addr n'est pas NULL, et si le protocole sous-jacent fournit l'adresse de la source, celle-ci y est insérée dans le tampon sur désigné par src_addr. Dans ce cas, addrlen est un paramètre-résultat. Avant l'appel, il doit recevoir la valeur de la taille du tampon associé à src_addr. En retour, addrlen est mis à jour avec la valeur réelle de l'adresse source. Cette adresse est tronquée si le buffer fourni n'a pas une taille suffisante ; dans ce cas addrlen renvoie un valeur supérieure à celle fournie lors de l'appel.
Si le processus appelant n'est pas intéressé par l'adresse de la source, src_addr doit avoir la valeur NULL, et addrlen doit valoir 0.
L'appel recv() est normalement utilisé sur une socket connectée (voir connect(2)). Il est équivalent à l'appel :
recvfrom(fd, buf, len, flags, NULL, 0));
L'appel recvmsg() utilise une structure msghdr pour
minimiser le nombre de paramètres à fournir directement. Cette
structure est définie dans <sys/socket.h> comme
ceci :
struct iovec { /* dispersion/assemblage
d'éléments de tableaux */
void *iov_base; /* Adresse de début */
size_t iov_len; /* Nombre d'octets à transférer */
};
struct msghdr {
void *msg_name; /* adresse optionnelle */
socklen_t msg_namelen; /* taille de l'adresse */
struct iovec *msg_iov; /* tableau scatter/gather */
size_t msg_iovlen; /* # éléments dans msg_iov */
void *msg_control; /* métadonnées, voir ci‐dessous */
size_t msg_controllen; /* taille du tampon de métadonnées */
int msg_flags; /* attributs du message reçu */
};
Ici msg_name et msg_namelen spécifient l'adresse d'origine si la socket n'est pas connectée ; msg_name peut être un pointeur nul si le nom n'est pas nécessaire. msg_iov et msg_iovlen décrivent les tampons de réception comme décrit dans readv(2). msg_control, de longueur msg_controllen, pointe sur un tampon utilisé pour les autres messages relatifs au protocole, ou à d'autres données annexes. Lorsqu'on invoque recvmsg, msg_controllen doit contenir la longueur disponible dans le tampon msg_control ; au retour il contiendra la longueur de la séquence de message de contrôle.
Les messages ont la forme
struct cmsghdr {
socklen_t cmsg_len; /* nombre d'octets de données, y compris l'en-tête */
int cmsg_level; /* protocole d'origine */
int cmsg_type; /* type dépendant du protocole */
/* suivi de
unsigned char cmsg_data[]; */
};
Les données de service ne doivent être manipulées qu'avec les macros de cmsg(3).
À titre d'exemple, Linux utilise ce mécanisme pour transmettre des erreurs étendues, des options IP, ou des descripteurs de fichier sur des sockets de domaine UNIX.
Le champ msg_flags du msghdr est rempli au retour de recvmsg(). Il peut contenir plusieurs attributs :
Ces fonctions renvoient le nombre d'octets reçus si elles réussissent, ou -1 si elles échouent. Dans ce dernier cas, errno permettra d'identifier la cause de l'erreur.
Lorsque le partenaire d'une socket de flux se ferme proprement, la valeur renvoyée est 0 (c'est-à-dire la valeur habituellement renvoyée lorsqu'on arrive à la fin d'un fichier).
Les sockets de datagrammes autorisent des datagrammes de longueur nulle dans différents domaines (par exemple, les domaines UNIX et Internet). Lorsque de tels datagrammes sont reçus, la valeur renvoyée est 0.
La valeur 0 peut aussi être renvoyée lorsque le nombre d'octets demandé en réception d'une socket de flux est égal à 0.
Il y a des erreurs standards déclenchées par le niveau socket, et des erreurs supplémentaires spécifiques aux protocoles. Consultez leurs pages de manuel.
BSD 4.4 (ces fonctions sont apparues dans BSD 4.2), POSIX.1-2001.
POSIX.1-2001 décrit seulement les drapeaux MSG_OOB, MSG_PEEK, et MSG_WAITALL.
Les prototypes fournis concernent la glibc 2. Les Spécifications Single UNIX les définissent, mais le type de retour est ssize_t (alors que BSD 4.x, libc4 , et libc5 renvoient un int). L'argument flags est un int dans BSD 4.x, mais unsigned int dans libc4 et libc5. L'argument len est un int dans BSD 4.x, mais un size_t dans libc4 et libc5. L'argument addrlen est un int * dans BSD 4.x, libc4 et libc5. Le socklen_t * actuel a été inventé par POSIX. Consultez également accept(2).
Selon POSIX.1-2001, le champ msg_controllen de la structure msghdr devrait être de type socklen_t, mais il a actuellement le type size_t dans la glibc.
Consultez recvmmsg(2) pour plus d'informations au sujet d'un appel système propre à Linux, utilisé pour recevoir des datagrammes multiples avec un unique appel.
Un exemple d'utilisation de recvfrom() se trouve dans la page de manuel de getaddrinfo(3).
fcntl(2), getsockopt(2), read(2), recvmmsg(2), select(2), shutdown(2), socket(2), cmsg(3), sockatmark(3), socket(7)
Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.
Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C <section> <page_de_man> ».