Lesen von QTcpSocket mit QDataStream

8

Ich muss Binärdaten über QTcpSocket senden. Ich habe über QDataStream nachgedacht, aber ich habe ein Problem festgestellt - es schlägt automatisch fehl, wenn zu dem Zeitpunkt, an dem ich versuche zu lesen, keine Daten angekommen sind.

Zum Beispiel, wenn ich diesen Code habe:

%Vor%

Es wird automatisch fehlschlagen, wenn keine Daten im Socket vorhanden sind. Gibt es eine Möglichkeit, es stattdessen zu blockieren?

    
sashoalm 30.10.2013, 11:55
quelle

3 Antworten

7

Ich habe den Code von @ Mareks Idee überarbeitet und zwei Klassen erstellt - BlockReader und BlockWriter:

Beispielverwendung:

%Vor%

BlockReader:

%Vor%

BlockWriter:

%Vor%     
sashoalm 30.10.2013, 14:53
quelle
13

Das Problem ist ein bisschen ernster. Socket kann Daten in Blöcken empfangen. Selbst wenn Sie auf waitForReadyRead warten, kann es fehlschlagen, da nicht genügend Daten vorhanden sind, um ein Objekt sofort zu lesen.
Um dieses Problem zu lösen, müssen Sie zunächst eine Datengröße und dann die eigentlichen Daten senden. Sende den Code:

%Vor%

Am Empfänger müssen Sie warten, bis die Größe der verfügbaren Daten die Anforderung erfüllt. Der Empfängercode sieht mehr oder weniger so aus:

%Vor%

kleines Update, basierend auf der Dokumentation ist es möglich, QString zu lesen, ohne zusätzliche Größeninformationen hinzuzufügen, Da QString an QDataStream übergeben wird, enthält die Größe Informationen. Die Größe kann wie folgt überprüft werden: %Vor%     
Marek R 30.10.2013 12:48
quelle
3

Sie können die Funktion QTCPSocket :: waitForReadyRead aufrufen, die solange blockiert, bis Daten verfügbar sind, oder eine Verbindung zum readyRead () - Signal herstellen und beim Aufruf des Steckplatzes den Stream lesen.

    
TheDarkKnight 30.10.2013 12:05
quelle

Tags und Links