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 :

Taille du paquet en préfixe ?!


Sujet :

Réseau

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut Taille du paquet en préfixe ?!
    Salut,

    Je cherche à faire communiquer mon application C++/Qt avec un serveur, PHP.
    Certains me diront que c'est bizarre, mais c'est un choix que j'ai fait.
    Le serveur PHP tourne en CLI, et la socket est ouverte de la manière la plus classique possible (socket_create, socket_bind, socket_listen, socket_accept, socket_read).

    Du coté C++, l'envoi me parait aussi des plus classiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);
    out << "hello";
    socket->write(paquet);
    Le paquet est bien envoyé, mais il n'est pas seul... En effet, un premier caractère l'accompagne, qui se trouve être la taille du paquet !
    Par exemple, quand j'envoie "hello", le paquet est préfixé de chr(06), et si j'envoie "hellop", il l'est par chr(07).

    En gros, ça donne ça :
    0000 06 68 65 6c 6c 6f .hello
    0000 07 68 65 6c 6c 6f 70 .hellop
    Je comprends pas du tout pourquoi, j'suis relativement nouveau à Qt, surtout la partie réseau. Si vous avez une idée, je suis preneur !

    Mika.

  2. #2
    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
    Salut.
    Si tu n'avais pas cette taille, comment savoir la taille de ce que tu reçois?

    http://qt.developpez.com/doc/latest/qdatastream.html
    http://qt.developpez.com/doc/latest/...eamformat.html

    ps: y as aussi de l'endian dedans

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut
    Au moins, maintenant, je sais pourquoi j'ai cette fichu taille, et merci pour ça

    Toute fois, je ne comprends pas pourquoi je voudrais connaitre sa taille... Je n'ai qu'à la mesurer, si j'en ai besoin (ce qui n'arrivera surement pas...).
    Il n'y a pas une alternative à QDataStream, qui ne serialiserait pas les données ? QTextStream ne semble pas fonctionner pour moi.

    Alternativement, je me suis dit que je pourrais traiter les données coté PHP, et j'ai trouvé sur internet les fonctions "QtPack" et "QtUnPack", toute fois, celles-ci ne semblent plus fonctionner (les posts où je les ai trouvées ont 2+ ans), puisque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0e 00 00 00 0a 00 68 00  65 00 6c 00 6c 00 6f      ......h. e.l.l.o
    devient tout simplement
    le mieux que j'ai pu obtenir étant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0a 68 65 6c 6c 6f                                  .hello
    Mika.

  4. #4
    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 Mika56 Voir le message
    Toute fois, je ne comprends pas pourquoi je voudrais connaitre sa taille... Je n'ai qu'à la mesurer, si j'en ai besoin (ce qui n'arrivera surement pas...).
    Et comment ferais tu? Par exemple, tu reçois deux chaînes codées en utf16. Comment ferais tu pour les différencier?

    Il n'y a pas une alternative à QDataStream
    Tu le fait à la main avec tes conventions de sérialisation/de-sérialisation.

    Il n'y a rien de normalisé à ce niveau de couches réseaux.

    Après, cela dépend de ce que tu veux faire.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 19
    Par défaut
    Citation Envoyé par yan Voir le message
    Et comment ferais tu? Par exemple, tu reçois deux chaînes codées en utf16. Comment ferais tu pour les différencier?
    Je les décode et j'utilise strlen() ?


    En dehors de cela, j'ai réussit à l'instant à corriger mon problème.
    En fait, mon QDataStream passait (assez logiquement) par un QByteArray.
    J'ai remplacé les deux par un simple const char*. Le message "hello" est donc maintenant envoyé comme "hello", sans rien de plus, ou de moins.

    Mika.

  6. #6
    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 Mika56 Voir le message
    Je les décode et j'utilise strlen() ?
    Comment saurait tu que tu aura bien reçus toute les données de ta chaîne?
    et où il faut s'arrêter dans le stream?

    Dans ton cas cela peut être plus simple. Mais en générale ce n'est pas si simple que tu ne le pense. Par exemple, tu voulais envoyer "hello".

    En passant par un QString tu envoie la chaîne encodé en UTF16 d'où les 00 un peut partout et l'impossibilité de connaitre avec certitude la fin dans le stream reçus.

    En passant par const char *, tu envoie directement un tableau d'octet. Comment être sure de la position de fin de ton tableau dans le stream reçus?

    Tout ce que tu envoie par write est généralement concaténé avant d'être envoyé. Pour éviter d'envoyer des paquets vide.
    Si ton tableau est très grand, il sera envoyé en plusieurs paquets.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL Server, taille du paquet réseau
    Par Philippe Robert dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/07/2011, 18h35
  2. Taille des paquets en TCP
    Par coyotte507 dans le forum Développement
    Réponses: 2
    Dernier message: 26/08/2008, 12h57
  3. Réponses: 0
    Dernier message: 29/11/2007, 17h48
  4. [libpcap] probleme de taille du paquet enregistré
    Par onaipadesmickey dans le forum Développement
    Réponses: 4
    Dernier message: 16/08/2007, 16h38
  5. [Mysql 5.0 Windows] Problème de taille de paquets
    Par tralloc dans le forum Outils
    Réponses: 1
    Dernier message: 14/06/2007, 10h25

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