关闭由QNetworkAccessManager处理的连接

时间:2014-07-07 07:55:53

标签: apache tcp qnetworkaccessmanager

因此,我正在为嵌入式设备开发一个Web应用程序,该应用程序使用QNetworkAccessManager从Web服务器检索信息。每个请求都是一个GET请求,调用一个PHP页面,其中包含url中的一些参数。 PHP脚本的输出是我的应用正在请求的信息。

整个过程非常简单,可以简化为以下代码行:

void fetch() {
    Q_ASSERT(m_reply == 0);
    QUrl url = QUrl("http://subdomain.myserver.com/info.php?param1=1&param2=2");
    m_reply = m_qnam->get(url);

    connect (m_reply, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
    connect (m_reply, SIGNAL(finished()), this, SLOT(onFinished()));
}

void onReadyRead() {
    m_contents.append(m_reply->readAll());
}

void onFinished() {
    m_reply->deleteLater();
    m_reply = 0;
    // do something with the contents
    m_contents.clear();

   // fetch again
   fetch();
}

m_qnam是一个QNetworkAccessManager实例,m_contents是一个QByteArray。

这很好用,但是在尝试数百个这样的请求时遇到问题,我最终从服务器(Apache)收到429错误(来自同一IP的连接太多)。为了从中恢复,我必须断开与互联网的连接并重新连接(这给了我一个新的IP地址)。

我可以增加Apache上的最大连接数,但我相信一旦删除QNetworkReply就应该关闭TCP连接,但事实并非如此。由于我一次只下载一定数量的请求(这是由我的应用程序上的排队系统控制而QNetworkAccessManager也有最大同时下载次数),我不相信调整Apache是答案。

似乎TCP连接没有正确关闭。

所以我的问题是:

如何在下载完成后确保与我的服务器的每个连接都正确关闭。 QNetworkAccessManager应该处理这个吗?这是一个错误吗?我是否应该将自己的自定义TCP连接到我的服务器并在整个应用程序中保持一定数量的连接?如果是的话,我应该从哪里开始?

谢谢,任何帮助都将不胜感激。

Qt 5.3 / OSX / iOS

注意:修改我的问题以符合Pavel的评论。一次只有一个请求处于活动状态。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题:一旦删除了QNetworkReply,或者调用了abort()或close()方法,QNetworkAccessManager会正确关闭所有连接。当然,这是以异步方式发生的。

我收到的错误来自对我的服务器施加的一些限制,这些限制只允许来自每个IP的一定数量的连续连接。