【问题标题】:QNetworkAccessManager sends GET two timesQNetworkAccessManager 发送 GET 两次
【发布时间】:2012-12-10 15:01:42
【问题描述】:

我有一些类来干扰 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 输出研究。
在第二个请求之后,它发送带有 RST 标志的数据包作为对 FIN 的回答。 但我仍然看不出触发问题的 TCP 流没有区别。
F.e.这是wireshark的输出。 Stream 8 进展顺利。 Stream 11Stream 12 重复。
我被这个困住了。也许是服务器大小的一些协议错误,我不确定。或者可能是 QNetworkAccessManager 中的一个错误。

【问题讨论】:

  • 你能把 tcpdump 的输出贴出来吗?
  • 比较大,我上传到pastebin

标签: qt tcp qnetworkaccessmanager


【解决方案1】:

您是否尝试过在本地范围内不使用 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
   }

【讨论】:

  • 我会试试这个,谢谢。我已经有方法runAcync(QString request) 做同样的事情。问题是我需要在做任何其他事情之前得到答案,所以我使用了同步。此外,链接到 QT 4.7.x 库时似乎没有错误。如果有帮助,我会尝试同步并报告。
  • 这很奇怪。我刚刚将循环移至调用我的run() 的函数并将调用更改为runAcync(),它会有所帮助。这无疑是一些 qT 错误。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2014-11-23
  • 2019-09-13
  • 2015-05-17
  • 2021-03-26
  • 2011-09-06
相关资源
最近更新 更多