QNetworkAccessManager发送GET两次

时间:2012-12-10 15:01:42

标签: qt tcp qnetworkaccessmanager

我有一些类干扰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()时,有时(不是每次)都是两个相同的GET请求 (我看了tcpdump)。 qDebug()执行1次 我的代码中有错误吗?我看不出任何可能的解释。

更新: 经过一些tcpdump ouptut研究 在第二次请求之后,它发送带有RST标志的数据包作为FIN的答案。 但是我仍然可以看到触发问题的TCP流没有区别,但是没有 F.E.这是wireshark的输出。 Stream 8进展顺利。 Stream 11Stream 12重复。{。} 我坚持这个。也许这是服务器大小的一些协议错误,我不确定。或者这可能是QNetworkAccessManager中的一个错误。

1 个答案:

答案 0 :(得分:2)

您是否尝试过将代码重写为更异步而不在本地范围内使用QEventLoop?您的代码对我来说很好,但是您可能会遇到一些奇怪的QT错误,它会将处理请求排队并在本地范围内使用QEventLoop。我通常以下列方式使用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
   }