Bonjour,
Je me casse les dents sur un petit soucis, j'aimerais un simple programme serveur-client qui permet d'envoyer des messages, et afin de m'entraîner, j'utilise aussi le multi-threading c++11.
Seulement, voilà, pour je ne sais quel raison, les paquets reçus par le client sont incomplets (voir screen), après quelques recherches, je me rend compte que ça vient peut-être des paquets envoyés. Apparemment, lorsque que je fais
packet << cmd;
avec cmd qui est un string, le paquet ne contient pas tout le string contenu dans cmd.
Par le plus grand des hasards, quand je rajoute la ligne
std::cout << "Message original: " << cmd << std::endl;
juste avant, cela fonctionne, mais sans cette ligne, les messages reçus sont parfois incomplets, pourquoi?
Code du serveur émettant:
#include <SFML/Network.hpp>
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <stdlib.h>
#include <thread>
void sendString(const std::string &msg, std::unique_ptr<sf::TcpSocket> &client)
{
sf::Packet packet;
packet << msg;
client->send(packet);
packet.clear();
}
void thread_function(std::string *cmd)
{
while(*cmd != "close")
{
if(*cmd == "")
{
std::cout << "Entrez votre commande: ";
getline(std::cin, *cmd);
}
}
}
int main()
{
std::string cmd = ""; //Gere les commandes
sf::TcpListener listener;
std::vector<std::unique_ptr<sf::TcpSocket>> clients;
int iClient = 0;
sf::Socket::Status status;
clients.push_back(std::unique_ptr<sf::TcpSocket>(new sf::TcpSocket()));
listener.listen(53000);
listener.accept(*clients[iClient]);
std::cout << "Connexion " << iClient+1 << " reussie !" << std::endl;
sendString("Connexion reussie !", clients[iClient]);
listener.setBlocking(false);
std::thread threadObj(thread_function, &cmd);//Thread gerant les commandes de son côté
clients.push_back(std::unique_ptr<sf::TcpSocket>(new sf::TcpSocket()));
iClient++;
while(cmd != "close")
{
if(listener.accept(*clients[iClient]) == sf::Socket::Done)
{
clients.push_back(std::unique_ptr<sf::TcpSocket>(new sf::TcpSocket()));
sendString("Connexion reussie !", clients[iClient]);
iClient++;
std::cout << "Connexion " << iClient << " reussi !"<< std::endl;
}
if(cmd != "")
{
// std::cout << "Message original: " << cmd << std::endl; // <------ Ligne qui résout le soucis
for(int i = 0; i < clients.size()-1; i++)
{
sf::Packet packet;
packet << cmd;
status = clients[i]->send(packet);
}
cmd = "";
}
}
for(int i = 0; i < clients.size()-1; i++)
sendString("Connexion over", clients[i]);
threadObj.join(); //Attend que l'autre thread est fini avant de fermer le programme
return 0;
}
Code du client recevant:
int main(){
sf::TcpSocket socket;
socket.connect("127.0.0.1", 53000);
std::string msgrecu;
while(msgrecu != "over")
{
sf::Packet packet;
if(socket.receive(packet) == sf::Socket::Done)
{
packet >> msgrecu;
std::cout << packet.getDataSize() << " : " << msgrecu << std::endl;
packet.clear();
}
}
}
Merci bien de m'avoir lu, en espérant que j'ai été clair,
Bonne journée