IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Structure vers char* et vice versa


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Structure vers char* et vice versa
    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 :

    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...
    Et pour la réception :
    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,

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Points : 2 627
    Points
    2 627
    Par défaut
    Pour le 32/64bit. Sous Windows pas de souci.

    Sous Linux, ca coince : sizeof(long) = 4 (en 32bit) et 8 (en 64bit)

    tu peux aussi avoir une différence de valeur de sizeof(Message) juste avec le compilo : alignement à 1, 4 ou 8 octets.

    donc oui tu peux avoir des soucis.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci pour ces informations.

    Je me suis finalement orienté vers la solution "protobuf" de Google (https://developers.google.com/protoc...tutorial?hl=fr)

    Cela me permet de réaliser ce que je souhaitais à la perfection !

Discussions similaires

  1. [MySQL] Conversion automatique en float mysql vers php et vice versa
    Par xounet dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 25/04/2014, 14h21
  2. Fichier Excel vers BDD et vice versa
    Par simosamosomo dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 16/12/2012, 15h54
  3. conversion de decimale vers binaire et vice versa
    Par Abdelkaoui dans le forum Qt
    Réponses: 1
    Dernier message: 17/04/2008, 11h53
  4. Réponses: 4
    Dernier message: 24/04/2007, 17h01
  5. YUV vers RGB et vice-versa
    Par progfou dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 22/09/2006, 01h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo