recv | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
#include <sys/types.h>
#include <sys/socket.h> int recv(int s, void *buf, int len, unsigned int flags); ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen); ssize_t recvmsg(int s, struct msghdr *msg, unsigned int flags);
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Si from n'est pas NULL, et si le protocole sous-jacent fournit l'adresse de la source, celle-ci y est insérée. L'argument fromlen est un paramètre résultat, initialisé à la taille du tampon from, et modifié en retour pour indiquer la taille réelle de l'adresse enregistrée.
L'appel recv() est normalement utilisé sur une socket connectée (voir connect(2)) et est équivalent à recvfrom() avec un paramètre from nul.
Ces trois routines renvoient la longueur du message si elles 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. Les fonctions de réception renvoient normalement les données disponibles sans attendre d'avoir reçu le nombre exact réclamé.
Les appels système select(2) ou poll(2) peuvent permettre de déterminer si des données supplémentaires sont disponibles.
L'argument flags de l'appel recv() est constitué par 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 */ /* More data may follow */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
L'appel recvmsg() utilise une structure msghdr pour minimiser le nombre de paramètres à fournir directement. Cette structure à la forme suivante, définie dans <sys/socket.h> :
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 */ };
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; /* data byte count, including hdr */ int cmsg_level; /* originating protocol */ int cmsg_type; /* protocol-specific type */ /* followed by 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 fichiers sur des sockets Unix.
Le champ msg_flags du msghdr est rempli au retour de recvmsg(). Il peut contenir plusieurs attributs :
VALEUR RENVOYÉE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
ERREURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
POSIX.1-2001 décrit seulement les drapeaux MSG_OOB, MSG_PEEK, et MSG_WAITALL.
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Conformément à POSIX.1-2001, le champ msg_controllen de la structure msghdr devrait être typé socklen_t, mais la glibc actuelle (2.4) le type comme un size_t.
EXEMPLE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 13 octobre 1996 et révisée le 6 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 recv ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
EAGAIN | ERREURS |
EBADF | ERREURS |
ECONNREFUSED | ERREURS |
EFAULT | ERREURS |
EINTR | ERREURS |
EINVAL | ERREURS |
ENOMEM | ERREURS |
ENOTCONN | ERREURS |
ENOTSOCK | ERREURS |
MSG_CMSG_CLOEXEC (recvmsg() seulement ; depuis Linux 2.6.23) | DESCRIPTION |
MSG_CTRUNC | DESCRIPTION |
MSG_DONTWAIT | DESCRIPTION |
MSG_EOR | DESCRIPTION |
MSG_ERRQUEUE | DESCRIPTION |
MSG_OOB | DESCRIPTION |
MSG_PEEK | DESCRIPTION |
MSG_TRUNC | DESCRIPTION |
MSG_WAITALL | DESCRIPTION |