Lire à partir de QTcpSocket à l'aide de QDataStream
J'ai besoin d'envoyer des données binaires par le biais d'un QTcpSocket
. Je pensais à l'aide de QDataStream
, mais j'ai rencontré un problème - il silencieusement échoue si aucune donnée n'est arrivé à l'heure j'essaie de lire.
Par exemple si j'ai ce code:
QString str;
stream >> str;
Il échoue silencieusement si aucune donnée n'est actuellement là-bas dans le support. Est-il un moyen de le dire à bloc à la place?
OriginalL'auteur sashoalm | 2013-10-30
Vous devez vous connecter pour publier un commentaire.
Le problème est un peu plus sérieux. Socket peut recevoir des données en blocs, de sorte que même si vous attendez pour
waitForReadyRead
il peut échouer car il n'y a pas assez de données pour lire immédiatement certains objets.Pour résoudre ce problème, vous devez envoyer une taille de données d'abord, puis des données réelles.
Envoyer code:
Sur le récepteur, vous devez attendre jusqu'à ce que la taille des données disponibles est satisfait à l'exigence. Récepteur code ressemble plus ou moins comme ça:
petite mise à jour, basée sur la documentation il est possible de lire QString sans l'ajout des informations de taille, depuis QString passé à QDataStream contient des informations sur la taille. La taille peut être vérifiée comme suit:
Block
, qui permet d'automatiser l'écriture de la taille du bloc dans son constructeur/destructeur, et affichera le code de peu de temps.OK, j'ai fini d'écrire le cours, j'ai posté une réponse.
OriginalL'auteur Marek R
J'ai retravaillé le code de @Marek idée et créé 2 classes - BlockReader et BlockWriter:
Exemple d'utilisation:
BlockReader:
BlockWriter:
Cela peut par hasard être utilisé pour transmettre des fichiers VOLUMINEUX?
J'avais pense que oui. Aussi longtemps que vous divisez votre gros fichier(s) dans les blocs. Mais tout à la fois... probablement pas.
OriginalL'auteur sashoalm
Vous pouvez appeler le QTCPSocket::waitForReadyRead fonction, ce qui permet de bloquer jusqu'à ce que les données sont disponibles, ou connectez-vous à la readyRead() du signal et lorsque votre logement est appelé, puis lu à partir du flux.
me battre pour elle; ajoutant la taille des paquets et de vérification pour la taille de la douille de réception est certainement la bonne façon de faire.
OriginalL'auteur TheDarkKnight