QNetworkAccessManager und binary Stream ohne Header
Verfasst: 27. April 2012 13:53
Hallo zusammen,
ich benutze QT Version 4.6.3 unter debian 6.0.3 .
zum Einlesen eines von einem Messgerät per http bereitgestellten Datenstroms und einiger zusätzlicher Daten auf html-Seiten wollte ich den QNetworkAccessManager mittels GET Anfrage (QNetworkRequest) und QNetworkReply nutzen.
Das funktioniert auch bei den html-Seiten wunderbar.
Beim binary Stream wird die readyRead-Routine überhaupt nicht angesprungen. Daraufhin habe ich die error-Routine mit eingebunden, um den Fehler zu lokalisieren. Der gemeldete Fehler ist Fehler 2: RemoteHostClosedError.
WGET allerdings kann den Stream abspeichern:
Firefox macht den Download ebenfalls anstandslos.
Eine längere Suche im Internet brachte keine ähnlichen Informationen (nur Probleme mit SSL, womit ich nicht zu kämpfen habe), bis auf folgendes, was ich im QT-Quelltext (4.7.0) wiederfand (in 4.6.0 war es noch nicht drin), ob es in 4.6.3 drin ist, entzieht sich meiner Kenntnis. Es handelt sich um die Datei qhttpnetworkconnectionchannel.cpp ( Siehe Pfeile im Code):
Heisst das, QNAM hält die Antwort ohne Header und ohne Chunking für einen HostClosed und beendet die Verbindung?
Ich bin etwas ratlos, da ich bislang nur mit per WGET zwischengespeicherten Daten entwickelt habe (wo mein lokaler Webserver natürlich Header und Länge mitliefert). Habt ihr Tipps, was ich weiter testen kann? Update auf neue QT Version sehe ich als letzte Maßnahme.
Danke!
Kai
ich benutze QT Version 4.6.3 unter debian 6.0.3 .
zum Einlesen eines von einem Messgerät per http bereitgestellten Datenstroms und einiger zusätzlicher Daten auf html-Seiten wollte ich den QNetworkAccessManager mittels GET Anfrage (QNetworkRequest) und QNetworkReply nutzen.
Das funktioniert auch bei den html-Seiten wunderbar.
Code: Alles auswählen
reply = qnam.get(QNetworkRequest(url));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
this, SLOT(httpError(QNetworkReply::NetworkError)));
connect(reply, SIGNAL(readyRead()),
this, SLOT(httpReadyRead()));
connect(reply, SIGNAL(finished()),
this, SLOT(httpFinished()));WGET allerdings kann den Stream abspeichern:
Code: Alles auswählen
wget -S HOST:PORT
--2012-04-27 13:36:46-- HOST:PORT
Verbindungsaufbau zu HOST:PORT... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort...200 Keine Header, vermutlich ist es HTTP/0.9.
Länge: nicht spezifiziert
In »index.html« speichern.Eine längere Suche im Internet brachte keine ähnlichen Informationen (nur Probleme mit SSL, womit ich nicht zu kämpfen habe), bis auf folgendes, was ich im QT-Quelltext (4.7.0) wiederfand (in 4.6.0 war es noch nicht drin), ob es in 4.6.3 drin ist, entzieht sich meiner Kenntnis. Es handelt sich um die Datei qhttpnetworkconnectionchannel.cpp ( Siehe Pfeile im Code):
Code: Alles auswählen
case QAbstractSocket::RemoteHostClosedError:
// try to reconnect/resend before sending an error.
// while "Reading" the _q_disconnected() will handle this.
if (state != QHttpNetworkConnectionChannel::IdleState && state != QHttpNetworkConnectionChannel::ReadingState) {
if (reconnectAttempts-- > 0) {
closeAndResendCurrentRequest();
return;
} else {
errorCode = QNetworkReply::RemoteHostClosedError;
}
} else if (state == QHttpNetworkConnectionChannel::ReadingState) {
if (!reply->d_func()->expectContent()) {
// No content expected, this is a valid way to have the connection closed by the server
return;
}
if (reply->contentLength() == -1 && !reply->d_func()->isChunked()) {
--> // There was no content-length header and it's not chunked encoding,
--> // so this is a valid way to have the connection closed by the server
return;
}
// ok, we got a disconnect even though we did not expect it
errorCode = QNetworkReply::RemoteHostClosedError;
} else {
errorCode = QNetworkReply::RemoteHostClosedError;
}
break;Ich bin etwas ratlos, da ich bislang nur mit per WGET zwischengespeicherten Daten entwickelt habe (wo mein lokaler Webserver natürlich Header und Länge mitliefert). Habt ihr Tipps, was ich weiter testen kann? Update auf neue QT Version sehe ich als letzte Maßnahme.
Danke!
Kai