Salut, alors je vais mettre un code simple et minime cette fois : lorsque j'exécute ça côté serveur :
code du serveur :
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);
}
} 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;
socketUDP.send(packet, IpAddress::LocalHost, 4569);
}
}
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;
clients[i]->send(packet);
}
} 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++;
}
}
}
}
}
Lorsque j'envoie un message UDP suivit d'un message TCP avec le client, seul le message UDP est reçu par le serveur.
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);
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;
clientTCP.send(packet);
packet.clear();
message = "Ceci est un message UDP!";
packet<<message;
socketUDP.send(packet,IpAddress::LocalHost,4568);
while (true) {
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;
}
}
}
}
return 0;
}
Quand je mets des else if au lieu des if côté serveur dans la boucle ça va déja mieux mais lorsque je ferme et que je relance le client, le serveur ne reçoit juste qu'un message UDP et le client ne reçoit plus rien, bref, j'ai des ennuis avec ça dans mon plus gros projet, parfois , j'ai des messages qui n'arrivent pas et ça fait carrément planté le programme. :/
Voici la version avec les else if.
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);
}
} else 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;
socketUDP.send(packet, IpAddress::LocalHost, 4569);
}
} else {
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;
clients[i]->send(packet);
}
} 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++;
}
}
}
}
}
}
code côté client.
Le même que celui ci-dessus.
PS : la méthode close() est en protected, on a plus besoin de le faire ça, la sfml le fait automatiquement ?