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.
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.
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 :
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 :
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 >> |