重置QNetworkAccessManager后端的方法

问题描述 投票:4回答:2

如果ftp服务器需要身份验证,QNetworkAccessManager似乎不会处理ftp检索到的丢失文件。

情况是这样的:我从同一个需要用户名和密码的ftp服务器下载多个文件。我成功下载了几个文件,然后发送一个不存在的文件的GET。该请求报告失败。然后,我发送一个GET请求,该文件应该是有效的。该请求永远不会发出完成的信号或错误。

Qt 4.7.4

请帮忙!这让我疯了。我想如果我能以某种方式重置ftp后端,这个问题可能是可以解决的。

qt ftp qnetworkaccessmanager
2个回答
1
投票

你是这样连接QNetworkReply信号finished()

QObject::connect(reply, SIGNAL(finished()), netty, SLOT(finished()));

而是像这样尝试来自QNetworkAccessManager的完成信号:

connect(&network, SIGNAL(finished(QNetworkReply *)), netty, SLOT(finished(QNetworkReply *)));

请注意,您必须更改完成()插槽的原型。

最后一种方法是设置一个调用这样一个函数的计时器:

void check(QNetworkReply *reply){
 if(reply != NULL){
   if(reply->isFinished())
     finished(reply);
   else
     reply->abort();
 }
}

并注意这个错误:

https://bugreports.qt-project.org/browse/QTBUG-3443


1
投票

我遇到了与Qt 5.3.0相同的情况(好吧它仍然是测试版,但我坚信在Qt5.2.x上会再现同样的错误)。

QNetworkAccessManager正确报告ftp的fileNotFound错误,但永远不会从中恢复。任何后续ftp请求都会失败并显示相同的错误消息。

假设尝试获取badFile.txt(不存在)。我们得到了找不到badFile.txt的正确消息。如果我们然后尝试访问goodFile.txt(存在),我们得到

Error while downloading ftp://ftp.url.com/goodFile.txt: 
Downloading file failed:
Can't open /badFile.txt: No such file or directory"

之前的错误似乎永远停留在QNetworkAccessManager中。

对我有用的唯一解决方案是每次发现ftp未找到错误时删除并创建一个新的QNetworkAccessManager。这是通过简单地连接到QNetworkReply错误(QNetworkReply :: NetworkError)信号来完成的。如elmigranto所述,将为每个活动请求发出完成的信号。这显然只有在QNetworkAccessManager处理单个请求时才有效,否则必须特别注意不要中止由同一个管理器处理的任何并行请求。

QNetworkAccessManager完成(QNetworkReply *)和QNetworkReply finished()信号完全相同。正如Qt文档中所述,这两个信号是串联发射的。这不是解决这个问题的方法,如buster所述。

设置计时器可用于其他目的(例如连接超时),但也不能解决此特定问题。

© www.soinside.com 2019 - 2024. All rights reserved.