Qt QNetworkAccessManager发送GET两次

Qt QNetworkAccessManager发送GET两次,qt,tcp,qnetworkaccessmanager,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() << req

我有一些类可以干扰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;
}
const QString someClass::BASEURL=QString(“http://127.0.0.1:8000/?");
someClass::someClass():
经理(新QNetworkAccessManager(本))
{
}
QNetworkReply*someClass::run(QString请求)
{
qDebug()get(QNetworkRequest(QUrl(BASEURL+request));
loop.exec();
返回res;
}
调用run()方法时,有时(不是每次)两个GET请求是相同的 (我用tcpdump看了看)。qDebug()执行一次。
我的代码中有错误吗?我看不出任何可能的解释

更新: 经过一些tcpdump ouptut研究。
在第二个请求之后,它向FIN发送带有RST标志的数据包作为应答。 但我仍然看不到触发问题的TCP流与未触发问题的TCP流之间的差异。
这里是wireshark的输出。进展顺利。已与复制。

我受够了。可能是服务器大小的一些协议错误,我不确定。或者可能是QNetworkAccessManager中的一个bug。

您是否尝试过在本地范围内不使用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
   }
void someClass::run(QString请求)
{
qDebug()get(QNetworkRequest(QUrl(BASEURL+request));
}
void someClass::在请求完成时(QNetworkReply*响应)
{
//在这里用你的回答做一些事情
}

你能发布tcpdump的输出吗?它很大,所以我把它上传到了我会试试的,谢谢。我已经有方法
runAcync(QString请求)
执行同样的操作。问题是我需要在做任何事情之前得到一个答案,所以我使用了同步。另外,链接到Qt4.7.x libs时似乎没有bug。如果有帮助,我会尝试同步并报告。这很奇怪。我刚刚将循环移动到调用我的
run()
的函数,并将调用更改为
runAcync()
,这很有帮助。这是防御性的qT错误。非常感谢!