首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C、linux中启动FTP客户端的主动模式

问如何在C、linux中启动FTP客户端的主动模式
EN

Stack Overflow用户
提问于 2012-11-21 02:14:00
回答 2查看 14.1K关注 0票数 0

我不得不写一个小命令行FTP客户端的linux在C。它工作得很好的常用(目录管理,检索和存储文件等),我想添加主动模式(目前每个传输都是在被动模式下)。

我知道我必须发送以下形式的命令:

代码语言:javascript
复制
PORT a,b,c,d,e,f

其中a b c d是ip地址块,e f是端口号。然而,据我所知,ip必须是运行我的客户端的机器的ip,但有人建议我使用getsockname()。根据我的测试,getsockname()会给我套接字使用的接口的本地ip地址,而不是从互联网上看到的ip地址。所以我不能给出服务器要连接的ip地址。

问题是:我是否正确理解了命令PORT,以及如何获取正确的ip来发送该命令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-21 04:29:07

FTP主动模式意味着服务器打开与客户端的连接,并自行发送数据。这通常是不切实际的,所以发明了被动模式:服务器打开一个额外的端口,该端口侦听传入的连接,并在有人连接时开始传输。

因此,被动模式会话如下所示:

代码语言:javascript
复制
$ telnet localhost 21
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PASV 
227 Entering Passive Mode (127,0,0,1,185,37).
LIST
150 Here comes the directory listing.
            ---> here client opens another telnet session, 
            ---> connecting to the same server on port 185*256+37, specified by server:
              $ telnet localhost $((185 * 256 + 37))
              Trying 127.0.0.1...
              Connected to localhost.
              Escape character is '^]'.
              drwxrwxr-x    2 121      1003         4096 Aug 21 10:57 incoming
              drwxrwxr-x    7 0        1003         4096 Nov 09 21:04 pub
              Connection closed by foreign host.
            <---- end of data transfer session

226 Directory send OK.

下面是一个活动会话的示例:

代码语言:javascript
复制
$ telnet localhost 21
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 Welcome to EarlGray FTP
USER ftp
331 Please specify the password.
PASS ftp
230 Login successful.
PORT 127,0,0,1,45,45                      (ports are specified by client)
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.

        ---> here client listens for an incoming connection on port 45*256+45
          $ nc -l 0.0.0.0 $((45 * 256 + 45))
          drwxrwxr-x    2 121      1003         4096 Aug 21 10:57 incoming
          drwxrwxr-x    7 0        1003         4096 Nov 09 21:04 pub
        <--- data are rececived

226 Directory send OK.

P.S.FTP是一个非常古老的协议(大约从1970年开始定义),在没有路由器、网关和其他传输级别的好东西的时候定义的,通常有几台机器直接连接,所以主动模式工作得很好,被动模式是今天协议的生存方式。

所以,是的,您得到了正确的端口命令,但没有统一的方法来获取您的外部IP (在本地计算机上的几个不同网络中可能有几个您的IP,在通往服务器的路上可能有几个具有自己网络的网关,您想使用哪个?)。问题的第二部分,如何获取服务器看到的IP,无法回答(这就是被动模式的作用)。

票数 1
EN

Stack Overflow用户

发布于 2012-11-21 04:15:38

如果您在NAT之后,则NAT的响应能力会破坏端到端原则^W^WNAT端口/226命令/响应中的地址。NAT应该明确支持FTP。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13479499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档