重置QNetworkAccessManager后端的方法

时间:2012-07-20 22:39:09

标签: qt ftp qnetworkaccessmanager

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

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

Qt 4.7.4

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

2 个答案:

答案 0 :(得分: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 :(得分: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所述。

设置计时器对于其他目的(例如连接超时)非常有用,但也无法解决此特定问题。