Cours programmation réseau en C++

TCP - Envoi et réception de données

Bousk

Maintenant que nous savons nous connecter à un serveur, il est temps de communiquer avec lui : envoyer et recevoir des données.

Commentez

- Titre : Cours programmation réseau en C++

- Auteur : Bousk

- Parution : 21 juin 2016

- Mise à jour : 9 mai 2017

- Public visé :

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2016 Cyrille (Bousk) Bousquet. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Envoyer des données

- II. Recevoir des données

- III. Proposition de corrigé

I - Envoyer des données

send - int send(int socket, const void* datas, size_t len, int flags);

Envoie des données au socket en paramètre.

- socket est le socket auquel envoyer les données.

- datas les données à envoyer.

- len est la taille maximale des données à envoyer en octets.

- flags un masque d'options. Généralement 0.

Retourne le nombre d'octets mis en file d'envoi dans la mémoire tampon du système. Peut retourner 0. Retourne -1 sous Unix, SOCKET_ERROR sous Windows, en cas d'erreur.

L'appel à cette fonction est bloquant tant que tous les octets à envoyer n'ont pas été mis en file d'envoi.

send

SOCKET socket;
// initialisation et connexion
char buffer[1024];
if (send(socket, buffer, 1024, 0) == -1)
// erreur

II - Recevoir des données

recv - int recv(int socket, void* buffer, size_t len, int flags);

Réceptionne des données sur le socket en paramètre.

- socket est le socket duquel réceptionner les données.

- buffer est un tampon où stocker les données reçues.

- len est le nombre d'octets maximal à réceptionner. Typiquement, il s'agira de la place disponible dans le tampon.

- flags est un masque d'options. Généralement 0.

Retourne le nombre d'octets reçus et stockés dans buffer. Peut retourner 0 si la connexion a été terminée. Retourne -1 en cas d'erreur.

L'appel à cette fonction est bloquant tant qu'aucune donnée n'est reçue par votre socket et que la connexion n'est pas terminée.

recv

SOCKET socket;
// initialisation et connexion
char buffer[1024];
if (recv(socket, buffer, 1024, 0) <= 0)
// erreur ou connexion fermée

Training Time ! Lancez ou compilez le TD 02. Un serveur se lancera sur le port de votre choix. Créez un client pour vous y connecter (vous pouvez, voire devriez, utiliser le précédent en l'améliorant), puis à l'aide de ce client envoyez une phrase. Vous devriez voir la phrase s'afficher dans la console du serveur et il vous renverra la même phrase avec l'ordre des mots modifié aléatoirement.

Vous retrouverez les lignes de la partie précédente relative à la connexion d'un client. Quand le client envoie une phrase, celle-ci sera affichée, ainsi que la version modifiée qui lui est renvoyée.

Vérifiez que vous recevez les données correctement sur votre client.

III - Proposition de corrigé

Nous allons simplement modifier notre classe TCPSocket précédemment créée pour y ajouter le nécessaire à l'envoi et la réception de données.

Pour l'instant, il s'agira d'un simple wrapping autour des fonctions send et recv que nous avons découvertes dans cette partie.

Les prototypes seront donc tout simplement :

prototypes

int Send(const char* data, unsigned int len);
int Receive(char* buffer, unsigned int len);

L'implémentation n'aura rien de particulier non plus :

implémentation

int TCPSocket::Send(const char* data, unsigned int len)
{
return send(mSocket, data, len, 0);
}
int TCPSocket::Receive(char* buffer, unsigned int len)
{
return recv(mSocket, buffer, len, 0);
}

Rien d'extraordinaire jusque là, il est temps de passer à la partie suivante :)

Télécharger les codes sources du cours

Article précédent

Article suivant

<< TCP - Premiers-pas

TCP - Mise en place du protocole >>