Bon, je pense avoir trouvé la cause du problème, quand j'envoie plusieurs messages UDP du serveur vers le client, le client ne les reçoit plus au bout d'un moment par contre pas de problème pour les messages TCP, et du client vers le serveur ça marche toujours.
Je remet les 2 codes sources, j'ai modifié celui du client en envoyant les messages dans la boucle, j'ai du rajouté un sleep dans la boucle sinon, j'explose la file TCP.
Code côté serveur :
#include "server.h"
using namespace std;
using namespace sf;
void Server::launch() {
if (listener.listen(4567) == Socket::Done && socketUDP.bind(4568) == Socket::Done)
cout<<"Ok"<<endl;
selector.add(listener);
selector.add(socketUDP);
while (true) {
if (selector.wait()) {
if (selector.isReady(listener)) {
TcpSocket *client = new TcpSocket();
if (listener.accept(*client) == Socket::Done) {
cout<<"Client connected"<<endl;
selector.add(*client);
clients.push_back(client);
}
}
for (unsigned int i = 0; i < clients.size(); i++) {
if (selector.isReady(*clients[i])) {
Packet packet;
if (clients[i]->receive(packet) == Socket::Done) {
string message;
packet>>message;
cout<<"Received from client (TCP) : "<<message<<endl;
packet.clear();
message = "Ceci est un message TCP!";
packet<<message;
if(clients[i]->send(packet) == Socket::Done)
cout<<"Ok"<<endl;
else
cout<<"Erreur"<<endl;
} else {
selector.remove(*clients[i]);
vector<TcpSocket*>::iterator it;
for (it = clients.begin(); it != clients.end();)
if (*it ==clients[i])
it = clients.erase(it);
else
it++;
}
}
}
if (selector.isReady(socketUDP)) {
Packet packet;
IpAddress address;
unsigned short int port;
if (socketUDP.receive(packet,address, port) == Socket::Done) {
string message;
packet>>message;
cout<<"Received from client (UDP) : "<<message<<endl;
packet.clear();
message = "Ceci est un message UDP!";
packet<<message;
if(socketUDP.send(packet, IpAddress::LocalHost, 4569) == Socket::Done)
cout<<"Ok"<<endl;
else
cout<<"Erreur"<<endl;
}
}
}
}
}
Code côté client :
#include <SFML/Network.hpp>
#include <iostream>
#include <sstream>
using namespace std;
using namespace sf;
int main () {
TcpSocket clientTCP;
UdpSocket socketUDP;
SocketSelector selector;
if (clientTCP.connect(IpAddress::LocalHost, 4567) == Socket::Done && socketUDP.bind(4569) == Socket::Done)
cout<<"Ok"<<endl;
selector.add(clientTCP);
selector.add(socketUDP);
while (true) {
Packet packet;
string message = "";
stringstream ss;
ss<<"Ceci est un message pour test le protocole TCP avec la SFML."<<endl;
message += ss.str();
packet<<message;
if (clientTCP.send(packet) == Socket::Done)
cout<<"Ok"<<endl;
else
cout<<"Erreur"<<endl;
packet.clear();
message = "Ceci est un message UDP!";
packet<<message;
if (socketUDP.send(packet,IpAddress::LocalHost,4568) == Socket::Done)
cout<<"Ok"<<endl;
else
cout<<"Erreur"<<endl;
if (selector.wait()) {
packet.clear();
message = "";
IpAddress address;
unsigned short int port;
if (selector.isReady(clientTCP)) {
if (clientTCP.receive(packet) == Socket::Done) {
packet>>message;
cout<<"Received from server (TCP) : "<<message<<endl;
}
}
if (selector.isReady(socketUDP) == Socket::Done) {
if (socketUDP.receive(packet, address, port) == Socket::Done) {
packet>>message;
cout<<"Received from server (UDP) : "<<message<<endl;
}
}
}
sleep(seconds(1.f));
}
return 0;
}