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

Auteur Sujet: [Résolu]Problème d'envoi de structure par le réseau  (Lu 2639 fois)

0 Membres et 1 Invité sur ce sujet

bungee

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
[Résolu]Problème d'envoi de structure par le réseau
« le: Mars 20, 2013, 02:05:50 am »
Bonsoir  :)

Je vous expose mon problème que je n'arrive pas à résoudre. Il y a peut-être quelque chose que je rate...

J'ai un client et un serveur qui communique parfaitement (j'utilise sf::TCPSocket).
Je souhaite transmettre des types "struct" par le réseau.

Voici mes deux structures simplifiées :
tcp_proto est un type énuméré qui me sert à identifier le contenu de data.


typedef enum  { S_ROOM, .... } tcp_proto;

struct s_proto
{
        tcp_proto key;
        char data[512];
};

struct s_room
{
        std::string room_name;
        int nbPlayers;
};
 

Coté Serveur, mon code d'envoi de la structure :

struct s_proto s_to_send;
struct s_room s_room_to_send;

s_to_send.key = S_ROOM;
       
// Je transmets une liste de "salon" identifié par un nom et un nombre de joueurs.
for (std::list<Room *>::iterator it = r.begin(); it != r.end(); ++it)
{
        s_room_to_send.nbPlayers = (*it)->getCurrentClients();
        s_room_to_send.room_name = (*it)->getName();
        // ici, j'utilise memcpy pour copier la structure s_room  dans data[512]
        memcpy(s_to_send.data, &s_room_to_send, sizeof(s_room_to_send));
        // "c" est le client avec qui je communique (class Client)
        c.socket().send(&s_to_send, sizeof(s_to_send));
}
 

Je précise que la copie se fait parfaitement après vérification des champs de la structure.

Coté client, je reçois la structure mais data[512] ne contient pas les données attendues....
Le champ key est par contre valide (il contient bien S_ROOM).
struct s_proto spc;
struct s_room *spr;
std::size_t received = 0;
std::size_t size = sizeof(struct s_proto);

if (socket.receive(&spc, size, received) == sf::Socket::Done)
{
        // les "tcp_proto key" sont gérées dans un switch
        switch (spc.key)
        {
            case S_ROOM:

            // Je ne sais pas si l'utilisation de reinterpret_cast est bonne.. mais j'ai aussi essayé avec un cast
            // à la C, à savoir (struct s_room *)(spc.data)...
            spr = reinterpret_cast<struct s_room *>(spc.data);

            // Puis je stocke ma nouvelle room dans une liste à partir des données de data[512]
            rooms_list.push_back(new Room(spr->room_name, spr->nbPlayers));
            break;

            .
            .
            .
    }
}
 

Lors d'un débugage, je m'aperçois que data[512] ne contient pas la structure..

Désolé si mon code parait un peu fouilli, je reste un amateur !

Y-a t'il quelque chose que je fais de mal ?


Merci !!
« Modifié: Mars 20, 2013, 06:20:29 pm par bungee »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Problème d'envoi de structure par le réseau
« Réponse #1 le: Mars 20, 2013, 04:33:40 am »
Je m'y connais assez peu en réseau, mais ça a l'air compliqué ce que tu fais. Mais définir les flux << >> pour envoyer ta structure sous forme de sf::Packet ça te va pas ?
Regarde le 2eme exemple dans la doc. (au cas où tu connais pas :p sinon désolé)
« Modifié: Mars 20, 2013, 04:36:40 am par G. »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème d'envoi de structure par le réseau
« Réponse #2 le: Mars 20, 2013, 08:38:35 am »
Tu ne peux pas faire de la copie bit à bit pour un std::string, celui-ci ne contient pas directement les caractères, mais seulement un pointeur vers la zone mémoire qui les contient. Il faut donc que tu fasses une sérialisation un peu plus fine qu'un bête memcpy ;)
Laurent Gomila - SFML developer

bungee

  • Newbie
  • *
  • Messages: 9
    • Voir le profil
Re : Problème d'envoi de structure par le réseau
« Réponse #3 le: Mars 20, 2013, 06:20:11 pm »
Effectivement, j'ai remplacé la std::string par un tableau d'octets... et tout fonctionne  :)

Merci !