apache - 关闭由 QNetworkAccessManager 处理的连接

标签 apache tcp qnetworkaccessmanager

因此,我正在为嵌入式设备开发一个 Web 应用程序,它使用 QNetworkAccessManager 从 Web 服务器检索信息。每个请求都是一个 GET 请求,调用 URL 中包含一些参数的 PHP 页面。 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

注意:修改了我的问题以符合帕维尔的评论。一次只有一个请求处于事件状态。

最佳答案

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

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

关于apache - 关闭由 QNetworkAccessManager 处理的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24605559/

相关文章:

php - 使用 SSL 时是否有引用 header ?

node.js - NodeJS - TCP Net 和 HTTP 服务器都会因错误而崩溃吗?

qt - "stop/shutdown"QNetworkAccessManager 的正确方法是什么?

html - 使用 apache 注入(inject) html

php - 在 LiteSpeed 上使用 .htaccess 的 mod_proxy

c++ - 发送大数据时增强数据包之间丢失的asio tcp数据

c++ - 即使删除线程,线程数也会增加很多

c++ - Qtimer 在 QNetworkAccessManager 完成之前触发

php - 如何使用户 session 持续 24 小时?

networking - TCP 连接理论 : Minimum rate of sequence numbers