QNetworkAccessManager und binary Stream ohne Header

Alles rund um die Programmierung mit Qt
Antworten
muehle.kai
Beiträge: 3
Registriert: 25. April 2012 15:42

QNetworkAccessManager und binary Stream ohne Header

Beitrag 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
muehle.kai
Beiträge: 3
Registriert: 25. April 2012 15:42

Re: QNetworkAccessManager und binary Stream ohne Header

Beitrag von muehle.kai »

Hat niemand eine Idee?

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

LG,
Kai
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QNetworkAccessManager und binary Stream ohne Header

Beitrag 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 ...
muehle.kai
Beiträge: 3
Registriert: 25. April 2012 15:42

Re: QNetworkAccessManager und binary Stream ohne Header

Beitrag von muehle.kai »

Ja, das wars. Habe es nun über QTcpSocket implementiert. Läuft ausgezeichnet.
Antworten