Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [SFML1.6] Pas de réception de packets!  (Lu 2070 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
[SFML1.6] Pas de réception de packets!
« le: Juillet 29, 2012, 12:44:30 pm »
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...
« Modifié: Juillet 29, 2012, 01:18:37 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML1.6] Pas de réception de packets!
« Réponse #1 le: Juillet 29, 2012, 02:51:46 pm »
Citer
côté serveur il ne rentre pas dans la méthode OnRecieve
Les données sont-elles tout de même reçues ? En d'autres termes, est-ce réellement un problème d'héritage de paquet, ou bien de réception ?
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : [SFML1.6] Pas de réception de packets!
« Réponse #2 le: Juillet 29, 2012, 03:18:54 pm »

Citer
    Les données sont-elles tout de même reçues ? En d'autres termes, est-ce réellement un problème d'héritage de paquet, ou bien de réception ?

Les données ne sont pas reçue et il ne sors même pas du selector.Wait() donc un problème de réception plutôt.

Le client se connecte (la pas de soucis le serveur affiche bien qu'il est connecté), ensuite le client envoie un message au serveur, mais le serveur ne le reçois pas donc il n'affiche pas le message..., en gros il sors du Wait à la connexion mais ne sors pas du Wait() lors de la réception de message.

J'ai essayer de faire dans l'autre sens aussi (envoyer un message du serveur au client.), mais cela ne marche pas non plus. =/
« Modifié: Juillet 29, 2012, 03:20:45 pm par Lolilolight »

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : [SFML1.6] Pas de réception de packets!
« Réponse #3 le: Juillet 29, 2012, 04:05:12 pm »
Haaaaa j'ai trouvé!  :D

Rho la boulette que j'ai faîte!

            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(client);
 

C'était selector.Add(client) et pas selector.Add(socket) qui est en fait le socket du serveur du coup bah a chaque connexion d'un client je rajoutais la socket du serveur donc, ça ne marchais pas...