Le voici, code côté serveur :
#include <SFML/Network.hpp>
#include <iostream>
#include <vector>
using namespace sf;
using namespace std;
#include "symEncPacket.h"
int main () {
vector<TcpSocket*> clients;
TcpListener listener;
SocketSelector selector;
if (listener.listen(4567) == Socket::Done)
cout<<"Ok"<<endl;
selector.add(listener);
string message;
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])) {
SymEncPacket 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++;
}
}
}
}
}
return 0;
}
Code côté client :
#include <SFML/Network.hpp>
#include "symEncPacket.h"
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
using namespace sf;
int main () {
TcpSocket socketTCP;
if (socketTCP.connect(IpAddress::LocalHost, 4567))
cout<<"Ok"<<endl;
SocketSelector selector;
selector.add(socketTCP);
string message;
while (true) {
SymEncPacket packet;
packet.clear();
message = "Ceci est un message TCP!";
packet<<message;
socketTCP.send(packet);
if (selector.wait()) {
if (selector.isReady(socketTCP)) {
packet.clear();
if (socketTCP.receive(packet) == Socket::Done) {
packet>>message;
//cout<<"Received from server (TCP) : "<<message<<endl;
}
}
}
//sleep(seconds(0.5f));
}
return 0;
}
Et une bête classe gérant l'envoi de paquet personnalisés côté serveur et côté client, ici j'envoie le message tel quel, pas de cryptage neccessaire pour reproduire le bug.
Voici le .cpp
#include "symEncPacket.h"
using namespace std;
using namespace sf;
const void* SymEncPacket::onSend (size_t& dataSize) {
const char* datas = static_cast<const char*> (getData());
buffer.assign(datas, datas + getDataSize());
vector<char>::iterator it;
string message;
for (it = buffer.begin(); it != buffer.end(); it++)
message += *it;
cout<<"Message : "<<message<<endl;
for (unsigned int i = 0; i < message.size(); i++)
buffer.push_back(message.at(i));
dataSize = buffer.size();
return &buffer[0];
}
void SymEncPacket::onReceive (const void* data, size_t dataSize) {
const char* datas = static_cast<const char*> (data);
buffer.assign (datas, datas + dataSize);
string message;
vector<char>::iterator it;
for (it = buffer.begin(); it != buffer.end(); it++)
message += *it;
for (unsigned int i = 0; i < message.size(); i++)
buffer.push_back(message.at(i));
append(&buffer[0], buffer.size());
}
#endif
Et voici le .h
#ifndef SYM_ENC_PACKET
#define SYM_ENC_PACKET
#include <SFML/Network.hpp>
#include "symEnc.h"
class SymEncPacket : public sf::Packet {
private :
virtual const void* onSend(std::size_t& dataSize);
virtual void onReceive (const void* data, std::size_t dataSize);
std::vector<char> buffer;
std::vector<char> encBuffer;
};
#endif