Проблема в разработке FTPClient с использованием Qt - PullRequest
6 голосов
/ 01 декабря 2010

Я пытаюсь реализовать FTPClient при использовании QT Network.

Как мне справиться с исключительными случаями, например, при загрузке сетевой кабель отключен, не пропало подключение к Интернету и т. Д.?

Как мой FTPClient может узнать о таком событии и доступны ли такие уведомления?

Я пытался использовать такие сигналы, как done (bool), ommandFinished (int id, ошибка bool), но я не получаю никаких сигналов.

Ответы [ 5 ]

4 голосов
/ 01 декабря 2010

Вы, кажется, используете QFtp, который устарел.Вы должны использовать QNetworkReply (и QNetworkAccessManager), который завершил () и сигналы error (): Документация QNetworkReply .

3 голосов
/ 10 декабря 2010

Вы пытались создать пользовательский слот и подключить его к QNetworkReply error SIGNAL?

Затем вы можете проверить аргумент, чтобы определить ошибку и решить, как вы хотите ее устранить.

QNetworkReply::NoError  0   no error condition. Note: When the HTTP protocol returns a redirect no error will be reported. You can check if there is a redirect with the QNetworkRequest::RedirectionTargetAttribute attribute.
QNetworkReply::ConnectionRefusedError   1   the remote server refused the connection (the server is not accepting requests)
QNetworkReply::RemoteHostClosedError    2   the remote server closed the connection prematurely, before the entire reply was received and processed
QNetworkReply::HostNotFoundError    3   the remote host name was not found (invalid hostname)
QNetworkReply::TimeoutError 4   the connection to the remote server timed out
QNetworkReply::OperationCanceledError   5   the operation was canceled via calls to abort() or close() before it was finished.
QNetworkReply::SslHandshakeFailedError  6   the SSL/TLS handshake failed and the encrypted channel could not be established. The sslErrors() signal should have been emitted.
QNetworkReply::TemporaryNetworkFailureError 7   the connection was broken due to disconnection from the network, however the system has initiated roaming to another access point. The request should be resubmitted and will be processed as soon as the connection is re-established.
QNetworkReply::ProxyConnectionRefusedError  101 the connection to the proxy server was refused (the proxy server is not accepting requests)
QNetworkReply::ProxyConnectionClosedError   102 the proxy server closed the connection prematurely, before the entire reply was received and processed
QNetworkReply::ProxyNotFoundError   103 the proxy host name was not found (invalid proxy hostname)
QNetworkReply::ProxyTimeoutError    104 the connection to the proxy timed out or the proxy did not reply in time to the request sent
QNetworkReply::ProxyAuthenticationRequiredError 105 the proxy requires authentication in order to honour the request but did not accept any credentials offered (if any)
QNetworkReply::ContentAccessDenied  201 the access to the remote content was denied (similar to HTTP error 401)
QNetworkReply::ContentOperationNotPermittedError    202 the operation requested on the remote content is not permitted
QNetworkReply::ContentNotFoundError 203 the remote content was not found at the server (similar to HTTP error 404)
QNetworkReply::AuthenticationRequiredError  204 the remote server requires authentication to serve the content but the credentials provided were not accepted (if any)
QNetworkReply::ContentReSendError   205 the request needed to be sent again, but this failed for example because the upload data could not be read a second time.
QNetworkReply::ProtocolUnknownError 301 the Network Access API cannot honor the request because the protocol is not known
QNetworkReply::ProtocolInvalidOperationError    302 the requested operation is invalid for this protocol
QNetworkReply::UnknownNetworkError  99  an unknown network-related error was detected
QNetworkReply::UnknownProxyError    199 an unknown proxy-related error was detected
QNetworkReply::UnknownContentError  299 an unknown error related to the remote content was detected
QNetworkReply::ProtocolFailure  399 a breakdown in protocol was detected (parsing error, invalid or unexpected responses, etc.)

Некоторые из этих кодов ошибок относятся к HTTP, но другие являются более общими.

1 голос
/ 11 декабря 2010

Вот полный пример клиента QT FTP вместе с документацией.Я бы порекомендовал использовать их оболочки для QFTP класса .

Выдержка по обработке ошибок при загрузке:

 if (ftp->currentCommand() == QFtp::Get) {
     if (error) {
         statusLabel->setText(tr("Canceled download of %1.")
                              .arg(file->fileName()));
         file->close();
         file->remove();
     } else {
         statusLabel->setText(tr("Downloaded %1 to current directory.")
                              .arg(file->fileName()));
         file->close();
     }
     delete file;
     enableDownloadButton();
     progressDialog->hide();

Это также полностью рабочая демонстрация.Вот скриншот:

alt text

1 голос
/ 09 декабря 2010

Для обработки сетевых исключений при использовании QFtp вы можете прослушивать сигнал stateChanged ().Если состояние становится Закрывающим или Не подключенным, вы можете проверить, что является ошибкой ().

О QNAM против QFtp: QNAM - более чистый и новый API, но оба они предназначены для работы и официально поддерживаются.С точки зрения API, QFtp использует старый шаблон идентификатора команды (каждая команда возвращает идентификатор команды), который требует от нас отслеживать команды (например, чтобы выяснить, для какой команды был подан сигнал).Я считаю, что шаблон API QNAM намного лучше, потому что его команды возвращают объект QNetworkReply, который в свою очередь излучает сигналы.Но тогда API-интерфейсы QNAM, похоже, не настроены на ftp, а также обрабатывают http / s (например, нет удаления файлов через ftp ), так что, возможно, вы хорошо придерживаетесь QFtp сейчас.*

0 голосов
/ 09 декабря 2010

QNetworkAccessManager, как указано в комментариях, я не могу ответить, это базовая сетевая утилита для общих нужд, а не для доступа низкого уровня.

Есть несколько вариантов, которые вы можете сделать:

1) Реализовать протокол FTP самостоятельно и все функции, которые вы хотите, используя QTcpSocket и сервер.

2) Используйте QNetworkAccessManager и надеемся, что вы сможетеобойти все проблемы с ним.

Преимущества каждого подхода должны быть очевидны, но помните, что Qt - это не просто набор инструментов для создания клиента FTP.

...