Seite 1 von 1

Problem mit TcpSocket

Verfasst: 2. März 2009 15:20
von Neo E
Hallo, ich habe anhand eines Beispiels aus dem Buch Foundations of QT eine Anwendung geschrieben mit der ich Bilder über das Netzwerk übertragen kann.

Hier mal der Teil des Beispiels den ich nicht so richtig durchschaue:

void ClientDialog::tcpReady()
{

if( dataSize == 0 )

{

QDataStream stream( &socket );
stream.setVersion( QDataStream::Qt_4_0 );

if( socket.bytesAvailable() < sizeof(quint32) )
return;

stream >> dataSize;

}

if( dataSize > socket.bytesAvailable() )
return;

QByteArray array = socket.read( dataSize );
QBuffer buffer(&array);
buffer.open( QIODevice::ReadOnly );

Wenn ich den Programmcode debuggeg gibt es Szenarien in denen an der Stelle if( dataSize > socket.bytesAvailable() ) return; die Bedingung erfüllt ist und aus der Funktion gesprungen wird. Ich komme dann in die moc-Klasse und danach geht es nicht weiter.

Der Autor schreibt das es dafür da ist das gewartet wird bis das Bild vollständig übertragen wurde.

Kann mir jemand sagen was es damit auf sich hat, beziehungsweise erklären was da passiert. Das Debugging hilft nicht wirklich weiter.

Verfasst: 2. März 2009 18:48
von upsala
Und wenn das ganze noch schön formatiert wäre, dann könnte man es auch viel besser lesen...

Verfasst: 2. März 2009 19:06
von FaS
Ich glaube ich habe dieses Vorgehen in einem anderen Thread von dir sogar kommentiert.

Und
Der Autor schreibt das es dafür da ist das gewartet wird bis das Bild vollständig übertragen wurde.
zusammen mit Qt-Doku:
void QIODevice::readyRead () [signal]
This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.
[...]
sollte doch ausreichen als Erklärung? Nicht böse gemeint, aber ein bisschen mitdenken musst du dabei schon. Dass du dir die Dokumentation der verwendeten Funktionen anschaust, die es zu verstehen gilt, versteht sich hoffentlich von selbst. Z.B. was bytesAvailable() macht.

Wie auch immer:
Die Daten werden stückweise übertragen, d.h. nicht alles auf einmal. Jedes Mal, wenn dieses Signal ausgelöst wird, gibt es etwas mehr Daten - das steht oben im Zitat.
Es wird dann geprüft, ob bereits genügend Daten angekommen sind, um sie verarbeiten zu können. Die ersten Daten die ankommen sind nicht das Bild, sondern ein quint32, welches die Bildgröße enthält. Sobald diese Zahl angekommen ist (4 Byte groß), wird sie ausgelesen und anschließend wird auf dieselbe Weise gewartet, bis das vollständige Bild da ist, denn nun weiß man ja, wie groß es ist.