Man page - recv(2)

Packages contains this manual

Available languages:

en fr tr ja ru

Manual

recv

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
Le paramĂštre des attributs
recvfrom()
recv()
recvmsg()
VALEUR RENVOYÉE
ERREURS
VERSIONS
STANDARDS
HISTORIQUE
NOTES
EXEMPLES
VOIR AUSSI
TRADUCTION

NOM

recv, recvfrom, recvmsg - Recevoir un message d’un socket

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#include <sys/socket.h>

ssize_t recv(int sockfd , void buf [. len ], size_t len ,
int
flags );
ssize_t recvfrom(int
sockfd , void buf [restrict . len ], size_t len ,
int
flags ,
struct sockaddr *_Nullable restrict
src_addr ,
socklen_t *_Nullable restrict
addrlen );
ssize_t recvmsg(int
sockfd , struct msghdr * msg , int flags );

DESCRIPTION

Les appels systÚme recv (), recvfrom () et recvmsg () sont utilisés pour recevoir des messages depuis un socket, et peuvent servir sur un socket orienté 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.

La seule diffĂ©rence entre recv () et read (2) est la prĂ©sence de flags . Si l’argument flags est absent, recv () est gĂ©nĂ©ralement Ă©quivalent Ă  read (2) (mais voir les NOTES). De plus, l’appel suivant

recv(sockfd, buf, len, flags);

est équivalent à :

recvfrom(sockfd, buf, len, flags, NULL, NULL);

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 le socket, les appels Ă  rĂ©ception se mettent en attente, Ă  moins que le socket soit non bloquant (voir fcntl (2)), auquel cas la valeur -1 est renvoyĂ©e et errno est positionnĂ©e Ă  EAGAIN ou EWOULDBLOCK . Les appels Ă  rĂ©ception renvoient normalement les donnĂ©es disponibles, jusqu’au montant demandĂ©, 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 arrivent dans le socket.

Le paramĂštre des attributs

L’argument flags est constituĂ© Ă  partir d’un OU binaire entre une ou plusieurs des valeurs suivantes :
MSG_CMSG_CLOEXEC
( recvmsg () uniquement ; depuis Linux 2.6.23)

Positionner l’attribut « close-on-exec » pour le descripteur de fichier reçu Ă  l’aide d’un descripteur de fichier de domaine UNIX en utilisant l’opĂ©ration SCM_RIGHTS (dĂ©crite dans unix (7)). Cet attribut est utile pour les mĂȘmes raisons que l’attribut O_CLOEXEC de open (2).

MSG_DONTWAIT (depuis Linux 2.2)

Activer l’opĂ©ration non bloquante ; si elle bloque, l’appel Ă©choue avec l’erreur EAGAIN ou EWOULDBLOCK . Cela fournit un comportement identique Ă  la dĂ©finition de l’attribut O_NONBLOCK (Ă  l’aide de l’opĂ©ration F_SETFL de fcntl (2)), sauf que MSG_DONTWAIT est une option pour chaque appel tandis que O_NONBLOCK est un paramĂštre sur la description du fichier ouvert (voir open (2)), qui touchera tous les threads du processus appelant ainsi que d’autres processus dĂ©tenant des descripteurs de fichier se rapportant Ă  la mĂȘme description de fichier ouvert.

MSG_ERRQUEUE (depuis Linux 2.2)

Cet attribut demande que les erreurs soient reçues depuis la file d’erreur du socket. Les erreurs sont transmises dans un message annexe dont le type dĂ©pend du protocole ( IP_RECVERR pour IPv4). Il faut alors fournir un tampon de taille suffisante. Consultez cmsg (3) et ip (7) pour plus de dĂ©tails. Le contenu du paquet original qui a causĂ© l’erreur est passĂ© en tant que donnĂ©es normales dans msg_iovec . L’adresse de destination originale du datagramme ayant causĂ© l’erreur est fournie dans msg_name .

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 *);

ee_errno contient le code errno de l’erreur en file d’attente. ee_origin est le code d’origine d’oĂč l’erreur provient. Les autres champs sont spĂ©cifiques au protocole. La macro SO_EE_OFFENDER renvoie un pointeur sur l’adresse de l’objet rĂ©seau ayant dĂ©clenchĂ© l’erreur, en donnant un pointeur sur le message annexe. Si cette adresse n’est pas connue, le membre sa_family de la structure sockaddr contient AF_UNSPEC et les autres champs de la structure sockaddr sont indĂ©finis. Le contenu du paquet ayant dĂ©clenchĂ© l’erreur est transmis en donnĂ©es normales.

Pour les erreurs locales, aucune adresse n’est passĂ©e (cela peut ĂȘtre vĂ©rifiĂ© dans le membre cmsg_len de cmsghdr ). À la rĂ©ception d’une erreur, MSG_ERRQUEUE est placĂ© dans msghdr . AprĂšs rĂ©ception d’une erreur, l’erreur en attente sur le socket est rĂ©gĂ©nĂ©rĂ©e en fonction de la prochaine erreur dans la file et sera transmise lors de l’opĂ©ration suivante sur le socket.

MSG_OOB

Cette option demande la rĂ©ception de donnĂ©es hors-bande qui ne seraient pas reçues dans le flux normal de donnĂ©es. Certains protocoles placent ces donnĂ©es hors-bande en tĂȘte de la file normale, et cette option n’a pas lieu d’ĂȘtre dans ce cas.

MSG_PEEK

Cette option fait que l’opĂ©ration de rĂ©ception renvoie les donnĂ©es du dĂ©but de la queue de rĂ©ception sans les enlever de cette file. Ainsi un appel Ă  rĂ©ception ultĂ©rieur renverra Ă  nouveau les mĂȘmes donnĂ©es.

MSG_TRUNC (depuis Linux 2.2)

Pour les sockets bruts ( AF_PACKET ), les sockets de datagrammes Internet (depuis Linux 2.4.27/2.6.8), de netlink (depuis Linux 2.6.22) et des datagrammes UNIX ainsi que pour ceux des paquets ordonnĂ©s (depuis Linux 3.4) : renvoyer la taille rĂ©elle du paquet ou datagramme, mĂȘme quand il est plus grand que le tampon fourni.

Pour une utilisation avec des sockets de flux Internet, consultez tcp (7).

MSG_WAITALL (depuis Linux 2.2)

Ce drapeau demande que l’opĂ©ration de lecture soit bloquĂ©e jusqu’à ce que la requĂȘte complĂšte soit satisfaite. Toutefois, la lecture peut renvoyer quand mĂȘme moins de donnĂ©es que prĂ©vu si un signal est reçu, si une erreur ou une dĂ©connexion se produisent ou si les donnĂ©es suivantes Ă  recevoir sont d’un type diffĂ©rent de celles renvoyĂ©es. Ce drapeau n’a aucun effet sur les sockets de datagramme.

recvfrom()

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 dĂ©signĂ© par src_addr . Dans ce cas, addrlen est un paramĂštre valeur-rĂ©sultat. Avant l’appel, il doit ĂȘtre initialisĂ© Ă  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 tampon 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 et addrlen doivent avoir la valeur NULL.

recv()

L’appel recv () est normalement utilisĂ© sur un socket connectĂ© (voir connect (2)). Il est Ă©quivalent Ă  l’appel :

recvfrom(fd, buf, len, flags, NULL, 0);

recvmsg()

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 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; /* Nb. d’élĂ©ments dans msg_iov */
void *msg_control; /* Données annexes, voir ci-dessous */
size_t msg_controllen; /* Taille du tampon de données annexe */
int msg_flags; /* Attributs du message reçu */
};

Le champ msg_name pointe vers un tampon allouĂ© par l’appelant et qui est utilisĂ© pour renvoyer l’adresse source lorsque le socket n’est pas connectĂ©. L’appelant doit initialiser msg_namelen avec la taille de ce tampon avant l’appel ; si l’appel s’exĂ©cute avec succĂšs, msg_name prend pour valeur la longueur de l’adresse renvoyĂ©e. Si l’application n’a pas besoin de connaĂźtre l’adresse source, on peut affecter la valeur NULL Ă  msg_name .

Les champs msg_iov et msg_iovlen dĂ©crivent les emplacements de dispersion-regroupement (scatter-gather) tels qu’expliquĂ©s dans readv (2).

Le champ msg_control , de longueur msg_controllen , pointe sur un tampon utilisĂ© pour les autres messages du protocole relatifs au contrĂŽle, ou Ă  d’autres donnĂ©es annexes. Lorsqu’on invoque recvmsg , msg_controllen doit contenir la longueur du tampon disponible dans msg_control ; lors du retour d’un appel rĂ©ussi,il contiendra la longueur de la sĂ©quence du message de contrĂŽle.

Les messages ont la forme

struct cmsghdr {
size_t cmsg_len; /* nombre d’octets de donnĂ©es, y compris l’en-tĂȘte
(de type socklen_t dans POSIX) */
int cmsg_level; /* protocole d’origine */
int cmsg_type; /* type dépendant du protocole */
/* suivi de
unsigned char cmsg_data[]; */
};

Les donnĂ©es annexes ne doivent ĂȘtre manipulĂ©es qu’avec les macros de cmsg (3).

À titre d’exemple, Linux utilise ce mĂ©canisme de donnĂ©es annexes pour transmettre des erreurs Ă©tendues, des options IP ou des descripteurs de fichier sur des sockets de domaine UNIX. Pour plus d’informations sur l’utilisation de ce mĂ©canisme sur divers domaines de socket, voir unix (7) et ip (7).

Le champ msg_flags du msghdr est rempli au retour de recvmsg (). Il peut contenir plusieurs attributs :
MSG_EOR

indique une fin d’enregistrement, les donnĂ©es reçues terminent un enregistrement (utilisĂ© gĂ©nĂ©ralement avec les sockets du type SOCK_SEQPACKET ).

MSG_TRUNC

indique que la portion finale du datagramme a été abandonnée car le datagramme était trop long pour le tampon fourni.

MSG_CTRUNC

indique que des donnĂ©es de contrĂŽle ont Ă©tĂ© abandonnĂ©es Ă  cause d’un manque de place dans le tampon de donnĂ©es annexes.

MSG_OOB

est renvoyé pour indiquer que des données prioritaires ou hors-bande ont été reçues.

MSG_ERRQUEUE

indique qu’aucune donnĂ©e n’a Ă©tĂ© reçue, sauf une erreur Ă©tendue depuis la file d’erreurs.

MSG_CMSG_CLOEXEC (depuis Linux 2.6.23)

indique que MSG_CMSG_CLOEXEC a Ă©tĂ© spĂ©cifiĂ© dans l’argument flags de recvmsg ().

VALEUR RENVOYÉE

Ces appels 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’un 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’un socket de flux est Ă©gal Ă  0 .

ERREURS

Voici quelques erreurs standards dĂ©clenchĂ©es par la couche socket. Des erreurs supplĂ©mentaires peuvent ĂȘtre gĂ©nĂ©rĂ©es et renvoyĂ©es par des modules du protocole sous-jacent. Consultez leurs pages de manuel.
EAGAIN
ou EWOULDBLOCK

Le socket est indiquĂ© comme non bloquant et l’opĂ©ration de rĂ©ception bloquerait ou un dĂ©lai de rĂ©ception a Ă©tĂ© indiquĂ© et il a expirĂ© sans que l’on ait reçu quoi que ce soit. POSIX.1 autorise de renvoyer l’une ou l’autre des erreurs dans ce cas et n’exige pas que ces constantes aient la mĂȘme valeur. Une application portable devrait donc tester les deux possibilitĂ©s.

EBADF

Le paramĂštre sockfd est un descripteur de fichier non valable.

ECONNREFUSED

Un hĂŽte distant a refusĂ© la connexion rĂ©seau (gĂ©nĂ©ralement parce qu’il n’offre pas le service demandĂ©).

EFAULT

Un tampon pointe en dehors de l’espace d’adressage accessible.

EINTR

Un signal a interrompu la réception avant que des données soient disponibles ; consultez signal (7).

EINVAL

Un paramÚtre non valable a été fourni.

ENOMEM

Pas assez de mémoire pour recvmsg ().

ENOTCONN

Le socket est associĂ© Ă  un protocole orientĂ© connexion et n’a pas encore Ă©tĂ© connectĂ© (consultez connect (2) et accept (2)).

ENOTSOCK

Le descripteur de fichier sockfd ne fait pas référence à un socket.

VERSIONS

Selon POSIX.1, le champ msg_controllen de la structure msghdr devrait ĂȘtre de type socklen_t et le champ msg_iovlen devrait ĂȘtre de type int , mais ils ont tous deux le type size_t dans la glibc.

STANDARDS

POSIX.1-2008.

HISTORIQUE

POSIX.1-2001, 4.4BSD (apparu dans 4.2BSD).

POSIX.1 décrit seulement les drapeaux MSG_OOB , MSG_PEEK et MSG_WAITALL .

NOTES

Si un datagramme de taille nulle est en attente, read (2) et recv () avec un paramĂštre flags vide, donne un comportement diffĂ©rent. Dans ce cas, read (2) n’a aucun effet (le datagramme reste en attente) alors que recv () consomme le datagramme en attente.

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.

EXEMPLES

Un exemple d’utilisation de recvfrom () se trouve dans la page de manuel de getaddrinfo (3).

VOIR AUSSI

fcntl (2), getsockopt (2), read (2), recvmmsg (2), select (2), shutdown (2), socket (2), cmsg (3), sockatmark (3), ip (7), ipv6 (7), socket (7), tcp (7), udp (7), unix (7)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.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.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Cédric Boutillier <cedric.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 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 .