3

HTTPサーバーに干渉するクラスがあります。意味のあるコード部分は次のとおりです。

const QString someClass::BASEURL = QString("http://127.0.0.1:8000/?");

someClass::someClass():
    manager(new QNetworkAccessManager(this))
{
}

QNetworkReply *someClass::run(QString request)
{
    qDebug() << request;
    QEventLoop loop;
    QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), &loop, SLOT(quit()));
    QNetworkReply *res = manager->get(QNetworkRequest(QUrl(BASEURL + request)));
    loop.exec();
    return res;
}

run()メソッドを呼び出すと、(毎回ではなく)2つの同一のGETリクエストが発生することがあります(tcpdumpで調べました)。qDebug()は1回実行されます。
コードにエラーがありますか?考えられる説明がわかりません。

更新:いくつかのtcpdumpouptut調査の後。
2番目の要求の後、FINへの応答としてRSTフラグ付きのパケットを送信します。しかし、問題を引き起こすTCPストリームとそうでないTCPストリームに違いは見られません。
ここでのFeはwiresharkの出力です。ストリーム8はうまくいきました。ストリーム11はストリーム12と複製されました。
私はこれで立ち往生しています。サーバーサイズからのプロトコルエラーかもしれませんが、よくわかりません。または、QNetworkAccessManagerのバグかもしれません。

4

1 に答える 1

2

ローカルスコープでQEventLoopを使用せずに、コードをより非同期になるように書き直してみましたか?あなたのコードは私には良さそうですが、ローカルスコープでQEventLoopを処理および使用するためのリクエストをキューに入れる方法で遭遇する奇妙なQTバグがあるかもしれません。私は通常、次の方法でQNetworkAccessManagerを使用してGETおよびPOST要求を送信します。

   void someClass::run(QString request)
   {
     qDebug() << request;
     QObject::connect(manager, SIGNAL(finished(QNetworkReply*)), this,  SLOT(on_request_complete(QNetworkReply*)));
     QNetworkReply *res = manager->get(QNetworkRequest(QUrl(BASEURL + request)));
   }

   void someClass::on_request_complete(QNetworkReply* response)
   {
      // Do stuff with your response here
   }
于 2012-12-14T16:21:49.973 に答える