使用 QNetworkAccessManager::get() 函数从 FTP 下载文件时出现问题

Posted

技术标签:

【中文标题】使用 QNetworkAccessManager::get() 函数从 FTP 下载文件时出现问题【英文标题】:Problem downloading file from FTP using QNetworkAccessManager::get() function 【发布时间】:2020-01-24 21:44:18 【问题描述】:

这是我的第一个要求.. :)

我在使用 QT 框架并从 FTP 服务器下载单个文件(12kb 长)时遇到了一些问题。有关该问题的一些信息:

环境是 linux Embedded (yocto) 使用 QT 5.10 设备的网络连接是以太网,通过 LTE 连接(quectel 调制解调器 mc25) ftp 服务器没有 tlc 和 ssl 保护(客户的 ftp 服务器..) 服务器端口是2121 使用普通以太网(RJ 电缆)连接也可以使用相同的代码 通过调制解调器进行相同的 LTE 连接,使用“wget”linux 工具进行下载。 ftp 客户端模式是被动的(我已阅读 wget 输出) 在不同的 ftp 服务器上尝试(地址和服务器不同)我从来没有遇到过问题,相同的代码在其他 ftp 服务器上工作(肯定有 tlc 和 ssl 保护),也使用 LTE 调制解调器。 问题仅出在该 ftp 上,同时也在上传文件。

我的经验是我没有来自QNetworkAccessManager 的错误消息,也没有来自QNetworkRequest 对象的错误消息。根本没有分析器,没有错误。捕获QmetaObjectChange 信号,我只看到来自服务器的代码200 和文件的大小。停下来。

有什么想法可以帮助我找到我为什么要尝试这种奇怪的行为的原因吗? 感谢您的帮助。

阿尔贝托。

【问题讨论】:

请出示您的实际代码。也许您只是错误地使用了QNetworkAccessManagerQNetworkRequest,但我们看不到您在做什么。 嗨 Remi,代码基于这个例子.. code.qt.io/cgit/qt/qtbase.git/tree/examples/network/… ..infact 适用于所有 ftp 服务器和所有连接,除了那个! 更新:我使用 ubuntu PC 和 qt5.10 从公司外部(我在家)尝试了上述示例代码,但无法下载文件。上面的代码给了我以下警告.. qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method qt.network.ssl: QSslSocket: cannot resolve SSLv2_server_method 很奇怪,因为在嵌入式设备上使用 qt 没有给我那个警告。但是结果是一样的:我无法下载文件! 似乎问题出在删除 sslv2 的 openssl 上。我必须重新编译 openssl 以启用该协议.. askubuntu.com/questions/711863/… 谢谢大家! :) 【参考方案1】:

我终于明白了这个问题。 Openssl 库故意禁止使用过时且危险的协议,如 sslv2。这就是 QT 无法从特定 ftp 服务器下载文件的原因:服务器使用 sslv2。 使用过时的协议(如 sslv2)可能会导致黑客获取拦截您的网络会话的敏感数据。 我认为最好的解决方案是避免我的软件连接到这种类型的 ftp 服务器,我不想让我的系统也出现安全问题。我会提示一条错误消息,例如:“错误:ftp 服务器使用过时的和危险协议(sslv2)。不允许连接。” 您可以将插槽连接到信号以获得 ssl 警告。

void DownloadManager::doDownload(const QUrl &url)

    QNetworkRequest request(url);
    QNetworkReply *reply = manager.get(request);

#if QT_CONFIG(ssl)
    connect(reply, SIGNAL(sslErrors(QList<QSslError>)),
            SLOT(sslErrors(QList<QSslError>)));
#endif

    currentDownloads.append(reply);

https://code.qt.io/cgit/qt/qtbase.git/tree/examples/network/download/main.cpp?h=5.14

BR! :)

【讨论】:

以上是关于使用 QNetworkAccessManager::get() 函数从 FTP 下载文件时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

离线使用 QNetworkAccessManager

跨 dll 使用 QNetworkAccessManager

使用 QNetWorkAccessManager 将值传递给插槽

如何使用 Qt/QNetworkAccessManager (C++) 实现 SFTP

如何使用 QNetworkAccessManager 找出数据传输延迟

使用 QNetworkAccessManager 时如何处理代理