因此,我正在为嵌入式设备开发一个 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¶m2=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/