Ich habe ein Problem mit dem QDataStream um einen QTcpSocket. Im Prinzip möchte ich ein (langes) char* vom einen zum Anderen Socket schicken. Momentan nutze ich den folgenden Code:
Direkt nach dem Lese-Prozess ist der String str leer (qstrlength(str) == 0). Wenn ich kurze Zeit warte, ist er mir Daten gefüllt. Sieht so aus, als ob QDataStream nicht-blockend arbeiten würde. Krieg ich das irgendwie blockierend? Ich möchte danach direkt die Daten verarbeiten...
TCP arbeitet als "Stream", das heisst: die versendeten Daten kommen "stückchenweise" beim Client an, so dass dieser selbst prüfen muss, ob die Daten komplett sind...
Daher: du musst ein eigenes Protokoll dazu schreiben. Ein einfaches wäre, vor dem String dessen Länge (als int) zu senden. Diese Länge kannst du dann (beim ersten "readyRead()") beim Client auslesen und (allenfalls bei jedem weiteren "readyRead()") die "bytesAvailable()" auf diese Länge prüfen....
Dieses "Problem" wird etwa alle 2-3 Wochen gefragt... evt. findest du mit der Forensuche Code für ein solch primitives Protokoll...
Aus der Doku von QDataStream habe ich nur darauf geschlossen, dass der genau das machen soll... Der schickt ja an sich auch die Länge des Strings mit (zumindest so wie ichs aus dem Code lesen kann). Wie ist das dann eigentlich z.B. bei Doubles, die ich über QDataStream schicke? Muss ich dann auch erst überprüfen, ob genug Daten da sind?
Okay, ich hab das hier falsch interpretiert (als ein Warten auf \0):
QDataStream & QDataStream::operator>> ( char *& s )
This is an overloaded member function, provided for convenience.
Reads the '\0'-terminated string s from the stream and returns a reference to the stream.
Trotzdem nochmal die obige Frage: Muss ich das für alle Datentypen machen? Woher weiß ich, wie viele Bytes ich genau für jeden brauche (z.b. float, double, etc)?
Ich wuerde zuerst die zu versenden Daten in einem QByteArray zusammenstellen (QDataStream nicht direkt auf den Socket sondern auf ein QByteArray) und danach die Laenge (QByteArray::size()) plus Daten mittels Socket versenden. Wie du die Laenge uebermittelst (binaer (Achtung Endian), ASCII), bleibt dir ueberlassen...