Метод для сброса серверной части 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();
}
}
И помните об этой ошибке:
Я испытываю ту же ситуацию с 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, эти два сигнала испускаются в тандеме. Это НЕ решение этой проблемы, как заявлено Бастером.
Настройка таймера может быть полезна для других целей (например, тайм-аут соединения), но также не решит эту конкретную проблему.