Cependant, mes messages sont mal reçus :/. Lorsque j'envoie simultanément du côté serveur deux messages distinct, le slot readyRead est appelé qu'une seul fois. Mais parse est appelé une fois seulement. Je récupère le size de mon message que après que j'ai reçu minimum 24 bytes. Comment pourrai-je régler ce problème de lecture ? Je souhaite aussi pouvoir recevoir un grand nombre de donnée en Mo.
Non, TCP garantie l'envoie et l'intégrité de données. UDP c'est une véritable catastophe à ce sujet. Mais là n'est pas la question. Comment je pourrai lire le flux avec une concaténation du contenu correctement selon vous ?
D'après ton 2nd code (sauf erreur), ton message se compose, dans l'ordre, de:
4 octets "magicbytes"
12 octets command
4 octets payloadSize
4 octets de checksum
payloadsize octets qui constitue ton payload
A noter que dans ton if ligne 22-26, payload est vide. il faudrait afficher/vérifier pour chacune des lectures si tu lis bien ce que tu envois (on voit que les 1ères données ne sont pas les mêmes entre l'affichage de MSG et les données envoyées; les 1ères données de MSG correspondant au bloc du checksum)
Ce qui permet de filtrer correctement tous mes messages types reçus. La fonction marche correctement. Auriez-vous d'autres recommandations , trucs que je n'aurais pas vu ou si le code a une "faille" ?
Qt est un peu particulier. Le réseau est multi thread en interne, mais la partie public utilise les events et signaux-slots, pour avoir de la programmation événementielle, sans avoir besoin de thread (on peut threader si on a des traitements complexes a faire, mais ce n'est pas une obligation). C'est l'event loop qui se charge de gérer les tâches "asynchrones" (qui sont en fait séquentielles en pratique).
C'est une "feature" de Qt pour justement éviter d'avoir a manipuler des threads et donc simplifier le code.
Si vous "envoyez" 2 "messages" depuis le client, le serveur recevra probablement les 2 messages concaténés, parce que les algorithmes anti-congestion de TCP, ou autres, auront trouvés que tout envoyer en 1 coup était plus pertinant.
IL N'Y A PAS DE MESSAGE EN TCP, C'EST UN FLUX D’OCTETS.
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Oui, bien sur. D'ailleurs, de mémoire, les codes d'exemple de Qt montre comment les messages sont découpés manuellement en passant la taille dans les données, pour pouvoir découper chaque message à la réception. (Et je crois que justement, pour les codes d'exemple de QUdpSocket, ce découpage n'est pas fait dans les code d'exemple)
Si vous "envoyez" 2 "messages" depuis le client, le serveur recevra probablement les 2 messages concaténés, parce que les algorithmes anti-congestion de TCP, ou autres, auront trouvés que tout envoyer en 1 coup était plus pertinant.
IL N'Y A PAS DE MESSAGE EN TCP, C'EST UN FLUX D’OCTETS.
Oui, très certainement, mais c'est ce que la fonction fait. Elle parse le flux reçu via l'utilisation du QDataStream pour lire les bytes beaucoup plus facilement qu'avec un vieux m_socket->readAll();
Je sais pas trop. L'intérêt d'un stream, c'est de pouvoir traiter les données en même temps qu'elles arrivent, pour ne pas être obligé d'attendre d'avoir tout reçu pour les traiter.
A partir du moment où tu attend d'avoir tout reçu pour traiter, un readAll pourrait peut être convenir sans problème. Ou un UDP. Tout dépend de tes besoins et il y a toujours plusieurs façons (plus ou moins complexes) de faire la meme chose.
EDIT : surtout qu'au final, tu utilises aussi bien le data stream que des fonctions de lecture directe avec read().
Très bien. Je vais voir ceci de mon côté. En tout cas, merci pour votre aide et vos conseils ! Je ferme le sujet.
Bien respectueusement.
ReadyRead Qt
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.
Discord NaN. Mon site.