RECV(2)

NOM
recv, recvfrom, recvmsg - Recevoir un message sur une socket.

SYNOPSIS
#include <sys/types.h>
#include <sys/socket.h>

int recv(int s, void *buf, int len, unsigned int flags);

int recvfrom(int s, void *buf, int len, unsigned int flags struct sockaddr *from, int *fromlen);

int recvmsg(int s, struct msghdr *msg, unsigned int flags);

DESCRIPTION
recvfrom et recvmsg sont utilises pour recevoir des messages depuis une socket s, et peuvent servir a la lecture de donnees que la socket soit orientee connexion ou non. Si from est non nul, et si la socket n'est pas orientee connexion, l'adresse de la source du messages y est inseree. Fromlen est un parametre resultat, initialise a la taille du buffer from, et modifie en retour pour indiquer la taille reelle de l'adresse enregistree. L'appel recv est normalement utilise sur une socket connectee (voir connect(2)) et est equivalent a recvfrom avec un parametre from nul. Comme ceci est redondant il est possible que recv ne soit plus supporte dans le futur. Ces trois routines renvoient la longueur du message si elles reussissent. Si un message est trop long pour tenir dans le buffer, les octets supplementaires peuvent etre abandonnes suivant le type de socket utilise (voir socket(2)). Si aucun message n'est disponible sur la socket, les fonctions de receptions se mettent en attente, a moins que la socket soit non bloquante (voir fcntl(2)) auquel cas la valeur -1 est renvoyee, et errno est positionnee a EWOULDBLOCK. Les fonctions de reception retourne normalement les donnees disponibles dans la limite du parametre len sans attendre d'avoir recu le nombre exact reclame. Ce comportement peut etre modifie avec les options de socket SO_RCVLOWAT et SO_RCVTIMEO decrites dans getsockopt(2). L'appel select(2) peut permettre de determiner si des donnees supplementaires sont disponibles. L'argument flags de l'appel recv est constitue par un OU binaire ( | ) entre les valeurs suivantes

MSG_OOB
    traiter les donnees hors-bande

MSG_PEEK
    lire sans enlever les donnees

MSG_WAITALL
    attendre le nombre exact ou une erreur L'option MSG_OOB permet la lecture des donnees hors-bande qui ne seraient autrement pas placees dans le flux de donnees normales. Certains protocoles placent ces donnees hors-bande en-tete de la file normale, et cette option n'a pas lieu d'etre dans ce cas. L'option MSG_PEEK permet de lire les donnees en attente dans la file sans les enlever de cette file. Ainsi une lecture ulterieure retournera a nouveau les memes donnees. L'option MSG_WAITALL demande que l'operation de lecture soit bloquee jusqu'a ce que la requete complete soit satisfaite. Toutefois la lecture peut retourner quand meme moins de donnees que prevu si un signal est recu, une erreur ou une deconnexion se produit. l'appel recvmsg utilise une structure msghdr pour minimiser le nombre de parametres a fournir directement. Cette structure a la forme suivante, definie dans <sys/socket.h>
    struct msghdr {
    	caddr_t	msg_name;	/* optional address */
    	u_int	msg_namelen;	/* size of address */
    	struct	iovec *msg_iov;	/* scatter/gather array */
    	u_int	msg_iovlen;	/* # elements in msg_iov */
    	caddr_t	msg_control;	/* ancillary data, see below */
    	u_int	msg_controllen; /* ancillary data buffer len */
    	int	msg_flags;	/* flags on received message */
    };
Ici msg_name et msg_namelen specifient l'adresse destination si la socket n'est pas connectee, msg_name peut etre un pointeur nul si le nom n'est pas necessaire. Msg_iov et msg_iovlen decrivent les buffers de reception comme decrit dans readv(2). Msg_control, de longueur msg_controllen, pointe sur un buffer utilise pour les autres messages relatifs au protocole, ou a d'autres donnees annexes. Les messages ont la forme
    struct cmsghdr {
    	u_int	cmsg_len;	/* data byte count, including hdr */
    	int	cmsg_level;	/* originating protocol */
    	int	cmsg_type;	/* protocol-specific type */
    /* followed by
    	u_char	cmsg_data[]; */
    };
Par exemple, on peut utiliser ceci pour etre informe des changements du flux de donnees avec XNS/SPP, ou pour obtenir des donnees d'identification en demandant un recvmsg sans buffer immediatement apres l'appel de accept avec ISO. Les descripteurs de fichiers annexes sont desormais passes en tant que donnees annexes dans le domaine AF_UNIX avec cmsg_level valant SOL_SOCKET et cmsg_type valant SCM_RIGHTS. Le champ msg_flags est rempli au retour avec les informations concernant le message. MSG_EOR indiqe une fin d'enregistrement, les donnees recues terminent un enregistrement (utilise generalement avec les sockets du type SOCK_SEQPACKET). MSG_TRUNC indique que la portion finale du datagramme a ete abandonnee car le datagramme etait trop long pour le buffer fourni. MSG_CTRUNC indique que des donnees de controle ont ete abandonnees a cause d'un manque de place dans le buffer de donnees annexes. MSG_OOB indique que des donnes hors-bande ont ete recues.

VALEUR RENVOYEE
Ces fonctions renvoient le nombre d'octets recus si elles reussissent, ou -1 en cas d'echec, auquel cas errno contient le code d'erreur.

ERREURS

EBADF
    L'argument s n'est pas un descripteur valide.

ENOTCONN
    La socket est associe avec un protocole oriente connexion et n'a pas encore ete connectee (voir connect(2) et accept(2)).

ENOTSOCK
    L'argument s ne correspond pas a une socket.

EWOULDBLOCK
    La socket est non-bloquante et aucune donnee n'est disponible, ou un delai de timeout a ete indique, et il a expire sans que l'on ait recu quoi que ce soit.

EINTR
    Un signal a interrompu la lecture avant que des donnees soient disponibles.

EFAULT
    Un buffer pointe en dehors de l'espace d'adressage accessible.

CONFORMITE
4.4 BSD (ces fonctions sont apparus dans BSD 4.2).

VOIR AUSSI
fcntl(2), read(2), select(2), getsockopt(2), socket(2)