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 :

QTcpServer et sokets


Sujet :

Réseau

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 12
    Points
    12
    Par défaut QTcpServer et sokets
    Bonjour,

    Je suis entrain de suivre le tuto sur le mini Chat en réseau, mais je n'est malheureusement pas compris quelque chose d'essentiel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            if (socket->bytesAvailable() < (int)sizeof(quint16)) // On n'a pas reçu la taille du message en entier
                 return;
     
            in >> tailleMessage; // Si on a reçu la taille du message en entier, on la récupère
        }
     
        // Si on connaît la taille du message, on vérifie si on a reçu le message en entier
        if (socket->bytesAvailable() < tailleMessage) // Si on n'a pas encore tout reçu, on arrête la méthode
            return;
     
     
        // Si ces lignes s'exécutent, c'est qu'on a reçu tout le message : on peut le récupérer !
        QString message;
       in >> message
    La condition if(socket->bytesAvailable()<(int)sizeof(quint16)) reste un peu incompréhensible pour moi.

    Que signifie réellement sizeof(quint16) ? bytesAvailable récupère-t-il le nombre de bytes du sous paquet reçu actuel ou récupère le nombre de bytes de tous les sous paquets reçus depuis le début?

    Voilà, c'est pleins de petites questions comme celles-là que je me pose.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Le sizeof() est un mot clé du C et C++. Il permet de connaître la taille en octet de l'élément qu'on lui passe.
    Ça sera deux.


    bytesavailable() indique le nombre d'octet qui peuvent être lu sur la socket.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Ha super merci, mais qu'arrive t-il si le nombre d'octet qui peut être lu par la socket dépasse 2 octet?

    Nom : sousPaquets.png
Affichages : 207
Taille : 5,4 Ko

    On voit sur l'image qu'au deuxième sous paquet, la taille du message n'est pas encore reçu entièrement, mais qu'au troisième sous paquet, la taille est reçu entièrement avec un bout du message, alors comment cela se fait que la variableTaille message ne contient ensuite que la taille du message et non la taille+un bout du message?

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    En théorie, lorsque l'on reçoit deux octets, on les lit (et après bytesAvailable = 0), puis, soit on recheck la taille, soit on essaie de lire sur la socket qui deviendra bloquante, la suite du paquets.
    Et s'il n'y a pas assez d'octets, bah, on ne fait rien, vu que l'on ne peux pas lire le message en entier.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Ce n'est pas ce que je voulais dire, je vais prendre un exemple concret:
    J'envoi un paquet avec la taille devant et ensuite le message: "7bonjour"

    Le sept est un quint16 donc est stocké sur 2 octets.

    La condition if socket->bytesAvailable() < sizeof(quint16) test si les octets reçus sont inférieurs à un 2octets, ce qui fait que l'on ne peut pas encore connaître la taille du message. Mais ma question est: si bytesAvailable() dépasse les 2 octets qui contiennent la taille du message, il récupère le début du message (selon moi) et donc pourquoi lorsque l'on fait in >> tailleMessage (lorsque la condition est vérifiée), cela stock seulement la taille du message (les 2 premiers octets, 7 pour le paquet exemple ci dessus) et non la taille du message+le début du message? (dans le paquet du haut par exemple 7+b)
    Voilà je ne comprend pas ceci

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Lorsque la taille est supérieur à la quantité voulue, ce n'est pas grave, car :
    Ne lit que deux octets (que les deux premiers octets), seulement et uniquement si tailleMessage est un quint16, par contre
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Mon...mon sauveur???
    Franchement ce n'est peut-être rien pour toi, mais pour moi c'était important de savoir cela!
    Je te remercie infiniment !!!!!!

    Edit:
    Juste une petite dernière question qui m'ai apparue maintenant que j'ai saisi la chose: comment faut-il faire pour récupérer deux quint16 distinct dans le même paquet?
    Par exemple si mon paquet contient la taille du message+le nombre de voyelle du message(par exemple)+le message
    83Bonjour
    ??

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Comme je l'ai dit :
    (toujours en assurant que le type de tailleMessage c'est un quint16, sinon ça marche pas.)
    Ce code ne lira que deux octets. Du coup, on peut refaire :
    Pour lire deux autres octets.

    Par contre, il reste un danger, c'est qu'il faut être complètement sur que le message contient bien deux quint16 (soit quatres octets) et que le message est bien émis en binaire et réceptionné en binaire.

    En effet, en mode texte :
    83Bonjour
    Avec le code :
    tailleMessage vaudra 83, car il ne sait pas où s'arrêter.

    D'ailleurs, c'est pour ça que je serait très prudents avec les >> et que j'utiliserai plus un read/write bas niveau. Là, je n'ai plus en tête ce qu'il faut faire et comment bien faire, mais maintenant, vous devez connaitre toutes les subtilités, il n'y a plus qu'à tester
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Super ! En tout cas je vous remercie beaucoup ! J'ai pus comprendre ce qu'il fallait, Merci

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

Discussions similaires

  1. ouvrir une URL avec soket
    Par lkaiman dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 27/04/2009, 15h03
  2. Explication des APIs & Soket ?
    Par tozen dans le forum VB.NET
    Réponses: 4
    Dernier message: 03/12/2008, 00h10
  3. Réponses: 6
    Dernier message: 08/11/2008, 11h58
  4. soket RAW + ARP ?
    Par x dans le forum Développement
    Réponses: 2
    Dernier message: 09/12/2005, 20h48
  5. Serveur Soket tcp interactif
    Par mobscene dans le forum Programmation et administration système
    Réponses: 5
    Dernier message: 01/10/2005, 13h16

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