Метод для сброса серверной части QNetworkAccessManager

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

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

Qt 4.7.4

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

2 ответа

Решение

Вы подключаете 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

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

QNetworkAccessManager правильно сообщает об ошибке fileNotFound для ftp, но никогда не восстанавливается после нее. Любые последующие запросы ftp терпят неудачу с тем же сообщением об ошибке.

Предположим, попробуйте получить badFile.txt (который не существует). Мы получаем правильное сообщение о том, что file2.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 (QNetworkReply*) и сигналы завершения () QNetworkReply делают то же самое. Как указано в документации Qt, эти два сигнала испускаются в тандеме. Это НЕ решение этой проблемы, как заявлено Бастером.

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

Другие вопросы по тегам