2016-10-20 34 views
0

QTcpServerとシンプルなサーバーがあり、QNetworkAccessManagerの単純なサーバーがあります。私はQNetworkAccessManagerのすべてを介して、任意のサイトからのデータを要求するとQNetworkAccessManagerとQTcpServerを使用する場合

  1. 私はカールまたはブラウザのすべてを介してサーバからデータを要求
  2. okです
  3. OKですしかし、私はQNetworkAccessManager経由QTcpServerからデータを読み取ることができません。すべての要求がリセットされます。 QNetworkAccessManager(クライアント)は、サーバーからデータを受信した直後にRST(リセット接続)を送信しました。クライアントコードでは、 "Connection closed"(RemoteHostClosedError
  4. また、DownloadManagerの例のQNetworkAccessManagerとFortuneServerのQTcpServerの例をさまざまな組み合わせで試してみましたが、結果は同じでした。

テスト済みのQtバージョン:

  • マックのQt 5.7
  • のLinuxのQt 5.7
  • のLinuxのQt 5.6.2
  • のLinuxのQt 5.5.1

Wiresharkのスクリーンショット: qt-wireshark.png
上部(赤い線ES)QNetworkAccessManagerの結果、成功結果に最新のパケットでQTcpServer

からデータを取得するためにカールしようとすると、またエラーを再現するための簡単な例がありますされていますtestNetwork.zip

そして、ここでは、クライアントのためのサンプルコードです:

void test(quint16 port) 
{ 
    QNetworkAccessManager *manager = new QNetworkAccessManager(); 

    QNetworkRequest request; 
    request.setUrl(QUrl(QString("http://127.0.0.1:%1/").arg(port))); 

    manager->connect(manager, &QNetworkAccessManager::finished, 
        [](QNetworkReply *reply) { 
     qDebug() << QString("Finished. %1. %2").arg(reply->errorString()).arg(reply->error()); 
     qDebug() << "readed: " << reply->readAll(); 
    }); 

    QNetworkReply *reply = manager->get(request); 

    reply->connect(reply, &QNetworkReply::readyRead, [reply]() { 
     qDebug() << QString("readyRead: '%1'").arg(QString(reply->readAll())); 
    }); 
} 

とサーバーの

QTcpSocket socket; 
... 
if(socket.waitForReadyRead(5000)) 
{ 
    QByteArray request; 
    request += socket.readAll(); 

    QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!"); 

    socket.write(responce); 
    if(!socket.waitForBytesWritten()) 
    { 
     qWarning() << QString("Error occurred in waitForBytesWritten() method of the tcp socket. %1 (%2)") 
         .arg(socket.errorString()) 
         .arg(socket.error()); 
    } 
} 
else 
{ 
    qWarning() << QString("Error occurred in read method of the tcp socket. %1 (%2)") 
        .arg(socket.errorString()) 
        .arg(socket.error()); 
} 

はまた、私はqt.ioにバグレポートを作成した(QTBUG-56631)

答えて

0

お客様のクライアントはHTTPリクエストを行っていますが、お客様のサーバーはhttpサーバーではありません。有効なHTTPリクエストを返信していません。

クライアントは、httpサーバであるため、Webサーバをポイントすると動作します。

QByteArray responce("HELLO, WORLD! HELLO, WORLD! HELLO, WORLD! HELLO, WORLD!"); 

は、有効なHTTP応答ではありません。

+0

はい、あなたは正しいです!あなたのお返事ありがとうございます! – Ildar

+0

そして、彼のレスポンスのために[Qt Forum](https://forum.qt.io)のraven-worxに感謝します: – Ildar

+0

彼のレスポンス: 少なくともレスポンスは以下のようになります。 注: 各行が\ r \ n空行がheader-及びコンテンツセクション Content-Lengthヘッダを分離 で終わるべきコンテンツ HTTP/1のバイト数です。1 200 OK 日:木、2016年10月20日午前12時28分53秒GMT サーバー:MyServerを1.0.0 のContent-Length:3 のContent-Type:text/plainの 接続:休館 XXX – Ildar

関連する問題