Способ сброса бэкэнда QNetworkAccessManager

Кажется, что QNetworkAccessManager не обрабатывает отсутствующие файлы, полученные по ftp, если сервер ftp требует аутентификации.

Ситуация такова: я скачиваю несколько файлов с одного и того же ftp-сервера, требующего имя пользователя и пароль. Я успешно загружаю несколько файлов, а затем отправляю GET для несуществующего файла. Этот запрос сообщает об ошибке. Затем я отправляю запрос GET для файла, который должен быть действительным. Этот запрос никогда не выдает готовый сигнал или ошибку.

Qt 4.7.4

Пожалуйста помоги! Это сводит меня с ума. Я думаю, что если я смогу каким-то образом сбросить бэкэнд ftp, эта проблема может быть решаема.


person IslandCow    schedule 20.07.2012    source источник
comment
Пример кода здесь gist.github.com/3153709   -  person IslandCow    schedule 21.07.2012
comment
Для сброса вы можете просто delete QNAM и создать новый (обратите внимание, что будет выдано QNetworkReply::fininshed). Кроме того, не забывайте reply->deleteLater() в своем NetworkHandler::finished(). Что происходит, когда вы пытаетесь загрузить недопустимый файл с помощью браузера? (Если проблема решена, примите ответ Бастера.)   -  person Aleksei Zabrodskii    schedule 08.08.2012


Ответы (2)


Вы подключаете сигнал QNetworkReply finished() следующим образом:

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

Вместо этого попробуйте готовый сигнал от QNetworkAccessManager следующим образом:

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

Обратите внимание, что вам придется изменить прототип для вашего слота finish().

Последним методом будет установка таймера, который вызывает такую ​​функцию:

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

И знайте об этой ошибке:

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

person buster    schedule 21.07.2012
comment
Как сказал @Konstantinos в своем ответе, это неэффективный обходной путь для этого ограничения в QNetworkAccessManager. Вам, вероятно, придется удалить и создать новый QNAM, как предложили он и Алексей. - person jageay; 05.04.2019

У меня такая же ситуация с Qt 5.3.0 (хорошо, это все еще бета-версия, но я твердо верю, что та же ошибка воспроизводится в Qt5.2.x).

QNetworkAccessManager правильно сообщает об ошибке fileNotFound для ftp, но никогда не восстанавливается после нее. Любые последующие 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.

Единственное решение, которое сработало для меня, состояло в том, чтобы удалять и создавать новый QNetworkAccessManager каждый раз, когда возникает ошибка ftp not found. Это делается простым подключением к сигналу ошибки QNetworkReply(QNetworkReply::NetworkError). Как заявил elmigranto, готовый сигнал будет выдаваться для каждого активного запроса. Очевидно, что это может работать только в том случае, если QNetworkAccessManager обрабатывает один запрос, в противном случае необходимо соблюдать особую осторожность, чтобы не прерывать любые параллельные запросы, обрабатываемые одним и тем же менеджером.

Сигналы QNetworkAccessManager finish(QNetworkReply*) и QNetworkReply finish() делают одно и то же. Как указано в документах Qt, эти два сигнала испускаются в тандеме. Это НЕ решение этой проблемы, как заявил Бастер.

Установка таймера может быть полезна для других целей (например, для тайм-аута соединения), но не решит и эту конкретную проблему.

person Konstantinos Gaitanis    schedule 07.05.2014