Bonjour à tous et à toutes !
J'aurais une petite question à poser et besoin de vos aides / avis sur un système de transfert de données via réseau...
L'idée est simple ; j'ai une structure qui est seule destinée à traverser le réseau d'un serveur à un client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 struct Message { struct message1 { int i; }; struct message2 { char c; int i; }; struct message3 { long l; long l2; char c; int i; bool b }; // Vous avez, je pense, compris l'idée :) ! enum MessageType { M1, M2, M3 }; MessageType type; union { message1 msg1, message2 msg2, message3 msg3 }; };
Je souhaiterais envoyé des instances de cette structure le plus facilement possible. J'entends par là limiter les opérations à écrire à l'ajout d'un nouveau type de message. Pour cela, j'ai pensé me servir d'un buffer de char :
Et pour la réception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Message e; // déjà initialisé char* buffer = (char*) &e; std::string sbuffer(buffer, sizeof(e)); // envoie de sbuffer sur le réseau // j'utilise un std::string intermédiaire pour éviter les surprises liées aux '\0' au milieu du buffer...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Message e; // déjà initialisé std::string sbuffer; // je remplis ici sbuffer avec ce qui vient du réseau const char* buffer = sbuffer.c_str(); e = *( (Message*) (buffer));
En local, ça marche, aucun problème.
Cela dit, je me pose une question à laquelle je crains imaginer d'avance la réponse...
La taille de ma structure "Message" varie t-elle en fonction de l'architecture où l'application est exécutée ? Ce code risque t-il de ne pas fonctionner si la communication se fait entre une machine 32 bits et une machine 64 bits ?
Si ma méthode s'avère problématique, est-il possible de régler le soucis ? Par exemple, serait-il utile de compiler le programme uniquement en 32 bits ? Dois-je utiliser des types spéciaux dans mes structures au lieu des types primitifs de base ?
En vous remerciant d'avance,![]()
Partager