Bonjour!
Pour mon moteur réseau j'utilise une classe dérivée de sf::Packet qui cryptera les messages que je veux envoyer avec l'algorithme rsa.
J'ai donc coder le serveur comme ceci :
#include "srkserveur.h"
#include <iostream>
using namespace sf;
using namespace std;
SrkServer::SrkServer(Rsa &rsa) : rsa(rsa)
{
if (!listner.Listen(4567)) {
cerr<<"Impossible d'écouter sur ce port"<<endl;
} else {
cout<<"serveur started"<<endl;
selector.Add(listner);
run();
}
}
void SrkServer::run () {
while (true) {
unsigned int nbSockets = selector.Wait();
for (unsigned int i = 0; i < nbSockets; ++i)
{
SocketTCP socket = selector.GetSocketReady(i);
EncryptedPacket packet(rsa);
if (socket == listner) {
IPAddress clientAddress;
SocketTCP client;
socket.Accept(client, &clientAddress);
cout<<"Client connected : "<<clientAddress<<endl;
selector.Add(socket);
} else {
if (socket.Receive(packet) == Socket::Done) {
string message;
packet>>message;
cout<<"A client said : "<<message<<endl;
} else {
selector.Remove(socket);
}
}
}
}
}
Et pour la gestion des packets j'ai fait comme dans le tutoriel :
#include "encryptedPacket.h"
using namespace std;
using namespace sf;
EncryptedPacket::EncryptedPacket (Rsa &rsa) : rsa(rsa) {
}
const char* EncryptedPacket::OnSend (size_t& dataSize) {
buffer.assign(GetData(), GetData() + GetDataSize());
/*encBuffer.clear();
vector<char>::iterator it;
for (it = buffer.begin(); it != buffer.end(); it++) {
BigInt nb = rsa.encryptWithPrKey(*it);
for (int i = nb.size() - 1; i >= 0; i--) {
encBuffer.push_back(nb[i]);
}
}
dataSize = encBuffer.size();
return &encBuffer[0];*/
dataSize = buffer.size();
return &buffer[0];
}
void EncryptedPacket::OnReceive (const char* data, size_t dataSize) {
buffer.assign(data, data + dataSize);
/*encBuffer.assign (data, data + dataSize);
buffer.clear();
vector<char>::iterator it;
for (it = encBuffer.begin(); it != encBuffer.end(); it++) {
BigInt nb;
for (int i = 0; i < Rsa::BLOC_SIZE; i++) {
Chiffre c (encBuffer[i]);
nb.push_back(c);
}
char car = rsa.decryptWithPrKey(nb);
buffer.push_back(car);
}*/
Append(&buffer[0], buffer.size());
}
(J'ai commenté le code de cryptage histoire de voir si cela marche sans, mais cela ne marche toujours pas.
)
Et voila le client :
#include "client.h"
using namespace sf;
using namespace std;
SrkClient::SrkClient (Rsa &rsa) : rsa(rsa) {
if(client.Connect(4567, sf::IPAddress::LocalHost) != Socket::Done) {
cout<<"Erreur : impossible de se connecter au serveur"<<endl;
} else {
run ();
}
}
void SrkClient::run () {
EncryptedPacket packet(rsa);
packet<<"Hello!";
client.Send(packet);
}
Il rentre bien dans la méthode OnSend côté client, mais côté serveur il ne rentre pas dans la méthode OnRecieve...