FTP分为主动模式与被动模式,在VC++ CLR中的 FtpWebRequest UsePassive 进行设置,默认是true也就是被动模式,设置为false则为主动模式。

reqFTP->UsePassive = false;  //选择主动还是被动模式-主动模式。

主动模式与被动模式区别,比如现在告诉你用8080端口作为FTP:

主动模式下:客户端使用8080作为命令连接,发送一些命令到服务器,同时发送一个 PORT 192,168,1,240 63,75 给服务器,告诉服务器,我的IP是192.168.1.240 端口是63*256+75=16203,你来连接我,进行数据通讯,显然这个IP是个局域网IP,处在公网的服务器是无法连接的,这个时候服务器就会发送一个连接错误过来 500 Illegal PORT command。

java ftp 主动模式 被动模式 ftp改主动被动_FTP被动模式

 

java ftp 主动模式 被动模式 ftp改主动被动_500 Illegal_02

所以主动模式就是服务器主动连接客户端的模式,这个模式在公网情况下是不可能实现的,毕竟服务器无法访问处于一个局域网下的客户端,如果是局域网,就要考虑到客户端的防火墙是否开启了端口,同时要设置客户端的数据端口范围,将这个数据端口设置到防火墙允许的端口列表中,否则就会出现 500 Illegal PORT command。

再来说说 被动模式:

被动模式就是客户端主动通过命令端口连接到FTP服务器,FTP服务器就会告诉客户端:227 Entering Passive Mode(172,16,155,42,23,139)

这个就是告诉客户端,我重新开启了一个数据服务端口,IP是:172.16.155.42 端口是:23*256+139=6027,但是你看这个IP也是个内网IP,如果你直接去连接,也是连接不上的,但是这个时候我们的客户端已经意识到这个问题了,直接会自动使用之前连接命令端口的那个IP去连接,然后连接这个端口,设想一下,在大多数情况下,服务器也是处于一个防火墙保护的网络内,如果不设置FTP的数据端口范围,岂不会在0-65535之间随机选择,这个时候如果这个端口没有被防火墙允许,那么客户端肯定也连接不上服务器,这个时候客户端就会报550超时错误了,如果随机的端口刚好被防火墙允许了,那就可以连接,如果你出现了偶尔能连接的情况,那么很大几率就是这个问题了。

最近遇到一个上传数据到FTP服务器就遇到这个问题,就是因为对方的FTP没有设置数据端口范围,导致偶尔能连接(刚好被防火墙允许的端口就能连接)。