La bibliothèque Live555 utilise un ensemble de fonctions dédiées à la manipulation des données réseau. Ces fonctions sont réparties dans plusieurs fichiers sources, avec une déclaration prépondérante dans live555sourcecontrol/groupsock/include/GroupsockHelper.hh. Elles se distinguent souvent par la présence d'un paramètre de type UsageEnvironment&, fournissant un contexte pour la gestion des erreurs et de l'environnement d'exécution.
Lecture de Données depuis une Socket
La fonction lireDepuisSocket (équivalent de readSocket) permet de récupérer des données entrantes depuis un descripteur de socket spécifique, de les stocker dans un tampon et de déterminer l'adresse de l'expéditeur. Elle renvoie le nombre d'octets effectivement lus. En cas d'échec, elle retourne 0 et initialise un message d'erreur de socket via socketErr(environnement, "Erreur lors de la réception : ").
// Fonction pour lire des données d'une socket UDP (par exemple)
int lireDepuisSocket(UsageEnvironment& environnement,
int descripteurSocket,
unsigned char* tamponReception,
unsigned tailleTampon,
struct sockaddr_in& adresseSource) {
SOCKLEN_T longueurAdresse = sizeof adresseSource; // Initialisation de la taille de l'adresse source
// Appel système pour recevoir des données sur le descripteur de socket.
// Les données sont placées dans 'tamponReception', 'adresseSource' contient l'adresse de l'émetteur.
ssize_t octetsLus = recvfrom(descripteurSocket,
(char*)tamponReception,
tailleTampon,
0, // Aucun flag spécifique pour cet appel
(struct sockaddr*)&adresseSource,
&longueurAdresse);
// Vérification des erreurs après l'appel à recvfrom
if (octetsLus < 0) {
// Récupération du code d'erreur système pour un traitement spécifique
int codeErreur = environnement.getErrno();
// Gestion des cas particuliers ou des "bugs" connus sur certaines plateformes.
// Ces erreurs ne sont pas toujours critiques et peuvent être ignorées.
if (codeErreur == ECONNREFUSED /* Linux: Connexion refusée */
#if defined(__WIN32__) || defined(_WIN32)
// Sur Windows, 'recvfrom()' peut retourner -1 avec 'errno' à 0
// ou 'EWOULDBLOCK' (socket non bloquante sans données).
// Ces situations sont traitées comme une lecture de zéro octet.
|| codeErreur == 0 || codeErreur == EWOULDBLOCK
#else
// Sur les systèmes de type Unix, 'EAGAIN' indique que l'opération bloquerait
// pour une socket non bloquante, et qu'aucune donnée n'est disponible.
|| codeErreur == EAGAIN
#endif
// 'EHOSTUNREACH' (Linux): Hôte inaccessible, peut survenir pour des sockets datagrammes.
|| codeErreur == EHOSTUNREACH) {
adresseSource.sin_addr.s_addr = 0; // Réinitialise l'adresse IP de l'expéditeur
return 0; // Retourne 0 octets lus, sans signaler d'erreur critique
}
// Pour toutes les autres erreurs, on signale une défaillance de la socket
environnement.socketErr("Erreur critique détectée lors de l'appel à recvfrom : ");
}
return (int)octetsLus; // Retourne le nombre d'octets réellement lus
}
Fonctions recv et recvfrom
Ces fonctions permettent de récupérer des messages à partir d'une socket. La fonction recvfrom est polyvalente et peut être utilisée avec des sockets orientées connexion (TCP) ou sans connexion (UDP). En revanche, recv est principalement employée avec des sockets orientées connexion, son comportement étant quasi identique à recvfrom lorsque le cinquième paramètre (adresse de l'expéditeur) est défini sur NULL.
Si le message à recevoir excède la capacité du tampon fourni, les octets excédentaires sont généralement ignorés, en fonction du type de socket. En l'absence de données disponibles sur la socket, l'appel à ces fonctions se mettra en attente jusqu'à la réception d'un message, à moins que la socket ne soit configurée en mode non bloquant.
Signatures des Fonctions
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recv(int sock, void *buf, size_t len, int flags);
ssize_t recvfrom(int sock, void *buf, size_t len, int flags,
struct sockaddr *from, socklen_t *fromlen);
Description des Paramètres
sock: Le descripteur de la socket depuis laquelle les données doivent être reçues.buf: Un pointeur vers le tampon de destination où le message reçu sera stocké.len: La taille maximale (en octets) du tampon pointé parbuf.flags: Une combinaison d'un ou plusieurs drapeaux (opérés par OR) qui modifient le comportement de la réception : | Drapeau | Description | |---|---| |MSG_DONTWAIT| Indique que l'opération ne doit pas être bloquée si aucune donnée n'est disponible. | |MSG_ERRQUEUE| Permet de récupérer les erreurs en attente sur la file d'erreurs de la socket, généralement sous forme de messages auxiliaires. | |MSG_PEEK| Les données sont copiées dans le tampon mais ne sont pas retirées de la file de réception, permettant des lectures ultérieures des mêmes données. | |MSG_TRUNC| Retourne la longueur réelle du paquet, même si elle dépasse la taille du tampon fourni. Applicable principalement aux sockets de type paquet. | |MSG_WAITALL| Requiert que l'opération soit bloquée jusqu'à ce que la requête de lecture soit entièrement satisfaite. Peut retourner moins d'octets si un signal est reçu, une erreur se produit, la connexion est coupée, ou si le type de données reçues change. | |MSG_EOR| Indique la fin d'un enregistrement (End Of Record). | |MSG_CTRUNC| Indique que des données de contrôle ont été tronquées en raison d'un manque d'espace dans le tampon. | |MSG_OOB| Demande la réception de données hors-bande (Out-Of-Band data), qui sont prioritaires. |from: Un pointeur vers une structuresockaddrqui sera remplie avec l'adresse de l'émetteur du message. SiNULL, l'adresse de l'expéditeur n'est pas stockée.fromlen: En entrée, ce pointeur doit désigner une varible contenant la taille maximale de la structurefrom. En sortie, il est mis à jour pour indiquer la taille réelle de l'adresse de l'émetteur.
Valeurs de Retour
En cas de succès, ces fonctions renvoient le nombre d'octets reçus. Si la connexion est fermée par l'autre extrémité, 0 est retourné. En cas d'échec, -1 est renvoyé et la varible globale errno est définie avec l'une des valeurs suiventes :
EAGAIN: La socket est marquée comme non bloquante et l'opération de réception bloquerait, ou un timeout de réception est survenu.EBADF:sockn'est pas un descripteur de fichier valide.ECONNREFUSED: L'hôte distant a refusé la connexion réseau.EFAULT: Une erreur d'accès à l'espace mémoire est survenue.EINTR: L'opération a été interrompue par un signal.EINVAL: Un paramètre non valide a été fourni.ENOMEM: Insuffisance de mémoire.ENOTCONN: La socket associée à une connexion n'est pas encore connectée.ENOTSOCK: Le descripteursockne fait pas référence à une socket.