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 !!