QNetworkAccessManager

Alles rund um die Programmierung mit Qt
Antworten
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

QNetworkAccessManager

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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)
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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)
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag 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.
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag 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!!!
Antworten