Bonjour,
Je me suis mis il y a peu (hier) à l'utilisation des sockets et j'ai donc décidé de créer deux classe pour pouvoir les gérer plus facilement (une pour le serveur, une pour le client). J'ai fais divers essaie en essayant d'envoyant une chaîne caractère (avec une tailleur de buffer prédéfini), un entier, une structure... ça marche à merveille. J'ai essayer ensuite d'envoyer plusieurs données à la suite, aucun problème... Et c'est justement ce qui est étrange, car lorsque j'envoie deux entiers à la suite, les deux sont bien reçu correctement, mais si j'envoie une chaîne avec sa taille (j'envoie d'abord la taille de la chaîne ensuite la chaîne en elle-même) je reçoit très bien la taille... mais je peux pas en dire autant de la chaîne :
Autant dire que j'ai un peu de mal à saisir comment mon "bonjour" à pu se transformer en "T<-?".
Voici les fonctions que j'utilise pour l'envoie :
Côté serveur
et côté client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void server::sendData(string data) { sendData(data.size() + 1); sendData(data.c_str(), data.size() + 1); } template <typename T> void server::sendData(T data, unsigned size) { std::cout << "SEND" << std::endl; std::cout << "data : " << data << std::endl; send(_csocket, reinterpret_cast<char*>(&data), size ? size : sizeof(data), 0); }
Je sais que normalement il aurait fallut faire une boucle lors de la réception pour être sûr de recevoir le message en entier mais étant donné que le message reçu ne correspond à rien par rapport au message envoyé je pense pas que ça résoudrais mon problème (même si j'ajouterais quand même cette boucle une fois mon problème résolu).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 template <typename T> T client::receiveData() { T data; if (!_connected) return data; recv(_socket, reinterpret_cast<char*>(&data), sizeof(data), 0); return data; } string client::receiveString() { unsigned size = receiveData<unsigned>(); cout << "RECEIVE" << endl; cout << "size : " << size << endl; char *data = new char[size]; recv(_socket, data, size, 0); cout << "data (char*) : " << data << endl; string dataString(data); cout << "data (string) : " << dataString << endl; delete[] data; return dataString; }
Voila, vous savez tout et donc j'espère que quelqu'un pourras m'aider à trouver d'où vient ce problème.
Merci et bonne journée.
Partager