chao_geng 2025-02-05 14:27 采纳率: 0%
浏览 38

qt的QNetworkAccessManager上传ftp数据,上传操作通过QNetworkProxy配置socks5代理实现行得通吗

问题描述1:
通过qt的QNetworkAccessManager来上传ftp数据,上传操作通过QNetworkProxy来定义一个socks5代理进行操作的。该配置方法检索了很多资料,配置代码如下截图,QNetworkAccessManager未配置socks5代理时可正常上传,配置代理后无法正常上传,显示103错误码,即找不到代理服务器。

img

img


问题描述2:
关于socks5代理服务器,本端通过本地window系统 cmd 调用ssh -D
来建立的通信隧道,通过winScp等ftp工具验证,通过 ssh-D建立的隧道可以进行ftp上传的

img

img

问题点:请问qt通过QNetworkAccessManager来上传ftp数据,上传操作通过QNetworkProxy定义socks5代理连接本端ssh -D建立的socks5服务器的方式不行吗?或者描述1中提到的qt上通过QNetworkProxy定义socks5配置有问题吗?有经验能给指点写吗?多谢!

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2025-02-05 14:27
    关注

    以下回复引自免费微信小程序:皆我百晓生。 如问题解决,还请采纳。如仍有疑问,请回复留言或私信博主,以便获得更精准的帮助。

    在QT中,使用QNETWORKACCESSMANAGER来处理FTP上传需要考虑以下几个关键点:

    1. 网络连接

      • 使用QNETWORKACCESSMANAGER::CONNECT()QNETWORKACCESSMANAGER::START()来建立连接。
      • 选择正确的网络协议(如TCP或UDP)并设置适当的端口。
      • 设置请求头以携带文件名和类型(如果有的话)。
    2. 文件传输

      • 要将文件从服务器传输到客户端,你需要创建一个文件对象并将其发送给服务器。
      • 客户端可以使用QNETWORKACCESSMANAGER::READFILE()QNETWORKACCESSMANAGER::DOWNLOADFILE()来读取或下载文件。
    3. 代理服务

      • 在某些情况下,你可能希望让网络服务作为代理服务提供服务,从而提高效率。
      • 这通常涉及使用代理服务器,这些服务器负责接收来自客户端的请求,并将它们转发给实际的FTP服务器。
    4. 防火墙和安全措施

      • 如果你的项目涉及到敏感信息的传输,例如用户密码、敏感文件等,可能需要添加额外的安全措施。

    对于上述步骤中的每个步骤,你可以根据实际情况调整参数和代码来确保正确性和性能。

    代码示例:

    #INCLUDE <QNETWORKACCESSMANAGER>
    #INCLUDE <QNETWORKPROXY>
    
    CLASS FTPCLIENT {
    PUBLIC:
        FTPCLIENT(CONST QSTRING& URL, CONST QSTRING& USERNAME, CONST QSTRING& PASSWORD) : M_URL(URL), M_USERNAME(USERNAME), M_PASSWORD(PASSWORD) {}
    
        VOID CONNECT() {
            QNETWORKACCESSMANAGER MANAGER;
            QNETWORKPROXY PROXY(QNETWORKPROXY::TCPSOCKS5);
            PROXY.SETHOSTNAME(M_URL);
            PROXY.SETPORT(80);
            PROXY.SETUSERNAME(M_USERNAME);
            PROXY.SETPASSWORD(M_PASSWORD);
            MANAGER.SETPROXY(PROXY);
    
            QNETWORKREQUEST REQUEST(QURL::FROMLOCALFILE(M_URL));
            MANAGER.GET(REQUEST).CONNECT(THIS, &FTPCLIENT::ONDOWNLOADFINISHED, THIS);
        }
    
    PRIVATE:
        QURL M_URL;
        QSTRING M_USERNAME;
        QSTRING M_PASSWORD;
    };
    
    VOID ONDOWNLOADFINISHED(CONST QNETWORKREPLY *REPLY, CONST QBYTEARRAY &DATA, INT STATUSCODE)
    {
        IF (STATUSCODE == 200) {
            QDEBUG() << "DOWNLOAD COMPLETED";
        } ELSE {
            QDEBUG() << "FAILED TO DOWNLOAD: " << STATUSCODE;
        }
    }
    
    INT MAIN(INT ARGC, CHAR *ARGV[])
    {
        QNETWORKACCESSMANAGER MANAGER;
        FTPCLIENT CLIENT("FTP.EXAMPLE.COM", "USERNAME", "PASSWORD");
        CLIENT.CONNECT();
    
        // 假设正在等待文件下载完成
        WHILE (!CLIENT.ISDONE()) {
            QTHREAD::MSLEEP(100);
        }
    
        RETURN 0;
    }
    

    在这个例子中,我们首先声明了一个FTPCLIENT类,它继承自QNETWORKACCESSMANAGER。然后,在CONNECT函数中,我们设置了代理服务器,并通过QNETWORKPROXY实现了网络连接。当服务器返回响应时,我们调用ONDOWNLOADFINISHED方法,这个方法会在下载过程中打印出结果。

    注意,由于此示例涉及敏感信息的传输,因此可能需要在实际项目中添加相应的安全措施,例如使用HTTPS或其他加密方式。此外,ONDOWNLOADFINISHED方法可能不适用于所有情况,具体取决于您的需求和项目的具体情况。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月5日