Seite 1 von 1

QNetworkAccessManager

Verfasst: 14. Februar 2009 14:57
von Superheftig
Hallo! Habe ein Problem mit QNetworkReply nachdem ich mit QNetworkAccessmanager eine html datei heruntergeladen hab.

Ab und zu passiert es, dass reply->readAll() nicht den kompletten inhalt der html datei zurück gibt. Am Ende der Datei fehlt ein Stück. replay->error() gibt aber NoError zurück. Vom Server wurde allerdings die komplette Datei abgeschickt (In den Server logs nachgeschaut)

Wo dran kann das liegen?

Verfasst: 14. Februar 2009 16:53
von solarix
Code wäre immer hilfreich... :wink:

Wie/Wann liest du denn vom Reply? Wartest du das Ende (Signal "finished(...)" der Übertragung ab? (http://doc.trolltech.com/4.4/qnetworkac ... l#finished)

Verfasst: 14. Februar 2009 17:31
von Superheftig

Code: Alles auswählen

void DownloadTool::downloadFinished(QNetworkReply* reply)
{

	if (reply->error() != QNetworkReply::NoError) {
		qDebug() << reply->error();
		
	}

	else {
		// Get the data
		QString data = QString(reply->readAll());

                // An der Stelle ist data dann ab und zu nicht vollständig
	}
}

Diese Funktion ist mit connect(networkmanager, SIGNAL(finished(QNetworkReply*)), this, SLOT(downloadFinished(QNetworkReply*))) mit dem finish Signal der des Networkmanagers verbunden. Das funktioniert auch alles. downloadFinished() wird immer korreckt aufgerufen. Nur replay->readAll() liefert nicht immer das komplette html dokument

Verfasst: 14. Februar 2009 18:01
von Christian81
Die Wandlung nach QString ist nicht wirklich korrekt - wenn in QByteArray Daten stehen die nicht in ASCII sind kann die Wandlung schief gehen. Wenn im QByteArray wirklich nicht alle Daten stehen dann sollte man mal weiter schauen - so wie es derzeit ist ist das Fehlen gut möglich.

Verfasst: 14. Februar 2009 18:41
von Superheftig
Es ist ja so, dass nicht irgendwelche umlaute oder so falsch sind, sondern das html file hört einfach in der mitte auf...kann das wirklich mit der konvertierung zu tun haben?

Habs aber mal mit QByteArray versucht ohne konvertierung zu QString. Passiert das gleiche. Funktioniert leider auch nicht.

Verfasst: 14. Februar 2009 21:57
von solarix
Da müssen noch weitere Hinweise her, wie z.B.:
- Kannst du das bei Internetseiten reproduzieren (Download von Dateien, welche wir ebenfalls testen könnten)
- Was für ein Webserver (evt. was exotisches (embedded)?)
- Liefert der Webserver den korrekten "content-length"? (Verifizierung mittels Wireshark)

Verfasst: 16. Februar 2009 17:02
von Superheftig
Das Problem tritt eigentlich bei allen domains auf die ich bis jetzt getestet habe. Es sind allerdings nicht immer die gleichen html files, die nicht komplett sind.

Der Webserver auf dem ich hauptsächlich getestet hab ist ein Apache2. Ich habe mit wireshark die ankommenden Pakete getestet. Die html Dateien sind auf jedenfall vollständig.

Verfasst: 16. Februar 2009 17:33
von Christian81
Die Klasse ist ziemlich neu - welche Qt-Version benutzt Du? Soweit ich die Klasse verstanden habe können danach immer noch readyRead() Signale auftreten - kann es sein dass zwar downloadFinished() ist, aber QNetWorkReply in Deinem Fall noch nicht alle Daten empfangen hat?

Verfasst: 16. Februar 2009 19:25
von upsala

Verfasst: 17. Februar 2009 13:36
von Superheftig
Soweit ich die Klasse verstanden habe können danach immer noch readyRead() Signale auftreten
void QNetworkReply::finished ()
This signal is emitted when the reply has finished processing. After this signal is emitted, there will be no more updates to the reply's data or metadata.
This signal is emitted in tandem with QNetworkAccessManager::finished()

Daraus würde ich jetzt mal schließen, dass keine readyRead Signal mehr auftreten können! Ich werde es jetzt trotzdem mal mit dem readyread() signal versuchen

Habs mal mit qt.4.5.0 rc1 versucht hab den fehler da auch noch.

Verfasst: 17. Februar 2009 18:32
von Superheftig
Habs auch noch mit ready read versucht.
Außerdem hab ich mal ein delay zwischen dem finished Signal und der funktion reply->readAll() eingebaut um sicher zu stellen das events die noch irgendwo unterwegs sind zu berücksichtigen....funkioniert aber alles nicht.

Jetzt benutzte ich QHttp das funktioniert auf anhieb!!!