【问题标题】:Ftp passive mode: connect to serverftp被动模式:连接服务器
【发布时间】:2014-02-26 22:49:38
【问题描述】:

我需要帮助我的 ftp 客户端应用程序。我使用用户名和密码成功连接到服务器并发送 PASV 消息。我收到了 IP 和端口,但我不知道下一步该做什么。我知道我必须连接到 IP 和端口,但我不知道如何。
谁能给我一个如何连接和接收来自服务器的消息的代码示例?

【问题讨论】:

    标签: c sockets tcp ftp passive-mode


    【解决方案1】:

    您已经拥有成功连接到服务器上端口 21 的代码,同样的代码也可以连接到 PASV 响应中返回的 IP 地址和端口号。

    但是

    在需要传输一些数据之前,您不希望进行第二次连接。您建立的第一个连接用于命令和对命令的响应。您与 PASV 返回的端口建立的连接是为了按照实际传输文件的命令传输数据,例如 RETR 或 LIST。

    【讨论】:

    • 我已经发送了 LIST 命令然后建立新的连接,但是每次我得到连接错误bzero(&sout,sizeof(sout)); sout.sin_family = PF_INET; cout.sin_port = htons(newPort); sout.sin_addr.s_addr = inet_addr(newIP.c_str()); if((connect(mysocket,(struct sockaddr *)&sout,sizeof(sin))) < 0){ cerr << "Connection Error" << endl; return -1; }
    • 不只是打印“连接错误”,而是使用类似的东西:cerr
    • 好吧,newIP有问题。您需要将其打印出来,看看它是否看起来像一个有效的 IP 地址(而且,我认为它必须是 IPv4 .. 因为您使用的是旧的 inet_addr() 函数.. 但我对此不是 100% 确定一)...这里的问题可能出在您正在解析服务器对 PASV 命令的响应的代码中。但是我看不到该代码,因此无法帮助您。但我想你现在知道如何解决这个问题了。打印出 newIP 的值,如果错了,从那里往后推,直到你发现哪里做错了。
    • 您可能没有正确解析 PASV 响应。它没有具有标准化格式,并且各种 FTP 服务器使用了几种不同的格式,因此您必须确保处理所有这些格式(另一方面,EPSV 具有标准化的格式)。您也可以考虑忽略PASV IP,只使用与您的命令套接字连接的相同 IP。
    • 谢谢大家。我从收到的缓冲区调用 getIP,因为响应不好。
    猜你喜欢
    • 1970-01-01
    • 2014-01-14
    • 2012-05-16
    • 1970-01-01
    • 2014-12-26
    • 2019-12-14
    • 2020-06-20
    • 2019-02-04
    相关资源
    最近更新 更多