Seite 1 von 1

QNetworkAccessManager und binary Stream ohne Header

Verfasst: 27. April 2012 13:53
von muehle.kai
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.

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()));
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:

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.
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):

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;
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

Re: QNetworkAccessManager und binary Stream ohne Header

Verfasst: 2. Mai 2012 08:18
von muehle.kai
Hat niemand eine Idee?

Woran liegts? Problem zu speziell, zu viele Informationen, fehlende Informationen?

LG,
Kai

Re: QNetworkAccessManager und binary Stream ohne Header

Verfasst: 4. Mai 2012 09:55
von RHBaum
HTTP-Anforderung gesendet, warte auf Antwort...200 Keine Header, vermutlich ist es HTTP/0.9.
Vermutung:
Http schreibt eigentlich vor, das auf nen GET mit nem HTTP header inklusive der Version antworten solltest.
Vielleicht kommt QNetwork damit nicht klar ....

Versuchs doch mal "RAW" also ueber Sockets.
HTTP iss ja nun auch kein hexenwerk ^^

Ciao ...

Re: QNetworkAccessManager und binary Stream ohne Header

Verfasst: 4. Mai 2012 13:44
von muehle.kai
Ja, das wars. Habe es nun über QTcpSocket implementiert. Läuft ausgezeichnet.