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

Réseau Discussion :

Problème réception de structure


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Par défaut Problème réception de structure
    Bonjour,

    dans le cadre d'un projet je dois faire communiquer une interface graphique créer avec Qt et un serveur en C.
    Les messages que j'envoie sont contenu dans une structure définie de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
        {
            int numMessage;
            int value;
            char text[100];
        } message;
    J'envoie mes messages avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Widget::on_pushButtonPlus_clicked()
    {
        int valueProgressBar = ui->progressBarVolume->value() + 1;
        ui->progressBarVolume->setValue(valueProgressBar);
     
        msg.numMessage = 2;
        msg.value = valueProgressBar;
     
        char *data = (char *)&msg;
        int szData = sizeof(data);
     
        tcpServer->write(data, szData);
    }
    Le problème est, que du coté de mon serveur (en C) je n'arrive à afficher que le premier élément de ma structure, à savoir msg.numMessage. Les autres sont à 0. Qu'est ce qui cloche? Est ce que j'utilise la meilleure méthode?

    Merci.

  2. #2
    Membre émérite

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2006
    Messages
    450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 450
    Par défaut
    Remplace sizeof(data) par sizeof(msg). Mais bon, le soucis est que c'est du code C++ et que de l'autre cote c'est du C. Pas le meme compilateur donc risque d'incompatibilite binaire si un des deux aligne les donnees differement... Tu n'auras peut-etre pas les bonnes valeurs au bon endroit avec la meme taille... (surtout si d'un cote c'est du 32 bits plate-forme et de l'autre 64...). J'imagine que tu controles un peu ton environnment donc que tu as a peu pret la meme plate-forme, apres il te reste a te renseigner sur la doc de ton compilo pour desactiver l'alignement des donnees. Sinon tu peux aussi utiliser la bibliotheque suivante qui te permettra de serialiser/deserialiser tes donnees en toute securite :

    http://code.google.com/p/protobuf/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Par défaut
    Citation Envoyé par TanEk Voir le message
    Remplace sizeof(data) par sizeof(msg)
    Ne marche pas...

    Quand à la serialisation, il faudrait que je deserialize en C, c'est possible?

  4. #4
    Membre chevronné
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Par défaut
    Sinon tu peux utiliser une union pour pouvoir utiliser ta structure comme un tableau de char instantanément sans avoir à faire de conversion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef union
    {
        struct
        {
            int numMessage;
            int value;
            char text[100];
        } donnee;
        char chaine[108];
    } message;
    Et tu utilise la même méthode du coté serveur pour récupérer tes données à partir de la chaine reçue...

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par haraelendil Voir le message
    Et tu utilise la même méthode du coté serveur pour récupérer tes données à partir de la chaine reçue...
    Et ou tu gère l'endian ou les alignement mémoire dans tous cela!!!!!!
    On envoie jamais une structure comme cela. On le serialise sous une forme que le client sera lire.
    par exemple en binaire:
    1- tag de début: correspodant au type de la classe
    2- envoie membre aprés membre
    Par exemple ce que fait Qt avec ses classes:
    http://qt.developpez.com/doc/latest/...eamformat.html


    ou du xml, json, ....

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 67
    Par défaut
    Citation Envoyé par yan Voir le message
    Et ou tu gère l'endian ou les alignement mémoire dans tous cela!!!!!!
    On envoie jamais une structure comme cela. On le serialise sous une forme que le client sera lire.
    par exemple en binaire:
    1- tag de début: correspodant au type de la classe
    2- envoie membre aprés membre
    Par exemple ce que fait Qt avec ses classes:
    http://qt.developpez.com/doc/latest/...eamformat.html


    ou du xml, json, ....
    Donc je devrai écrire un code du genre alors??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out  << (int) msg.numMessage;
         << (int) msg.value;
         << (char) msg.texte;
     
    tcpServer->write(block);

Discussions similaires

  1. [Mail] Problème réception mail/pieces jointes
    Par pymouse dans le forum Langage
    Réponses: 1
    Dernier message: 18/04/2006, 17h07
  2. [MySQL] Problème INSERTION ET STRUCTURE
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 31/01/2006, 14h22
  3. [Logiciel] Outlook : problème réception massive de mails
    Par malbaladejo dans le forum Outlook
    Réponses: 1
    Dernier message: 09/12/2005, 14h00
  4. Problème réception avec MsComm
    Par Jap dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 07/12/2005, 11h20
  5. [Virtual Pascal] [WinSock] Problème d'affichage structure SERVENT
    Par Alcatîz dans le forum Autres IDE
    Réponses: 2
    Dernier message: 12/07/2005, 22h53

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