您的位置:首页 > 编程语言 > PHP开发

FTP的两种不同工作模式

2010-12-09 21:01 267 查看
FTP的两种不同工作模式:PORT(主动模式)、PASV(被动模式)

1、PORT模式:该模式是FTP协议最初定义的连接模式,其连接过程是:在开始一个FTP连接时,客户端程序首先会为自己随机分配一个TCP端

口,它使用这个端口向服务器的FTP端口(默认21)发出连接请求,服务器接受请求后会建立一条控制链路,然后客户程序向服务器发出Port命

令,告诉服务器它的数据通道的端口打开了。当需要传送数据时,服务器端口通过20端口向客户端提供的随机端口发送连接请求,请求被接受之

后便开始传输数据,数据链路通道也就打开了, 在整个过程中,由于服务器在建立数据连接时主动发起连接,因此称为主动模式。

注:PORT模式的问题

由于客户端提供的端口号是随机的,如果客户端处于防火墙内部,由于防火墙大多会限制自问主机连接内部非开放端口,数据连接很可能被防火墙限制,造成无法建立数据连接,从而导致FTP无法正常工作

2、PASV模式:其连接过程是,在开始一个FTP连接时,客户端程序首先为自己随机分配一个TCP端口,它使用这个端口向服务器的FTP端口

(默认21)发出连接请求,服务器接受请求后会建立一条控制链路,然后客户端程序发出一Pasv命令,要求服务器采用PASV模式建立数据连

接,服务器便为自己随机分配一个数据通道端口,并将这个端口号告诉客户端程序。传送数据时,客户端程序采用另一个随机端口向服务器提供

的数据通道端口发送连接请求,请求被接受之后便开始传输数据,数据链路通道也就打开了。在这个方式中,由于服务器端在建立数据连接时,

被动接受客户端的连接请求,因此称为被动方式

注:被动方式,由于两个连接都由客户端发起,对于防火墙来说,一般不限制这样的访问,因此解决了防火墙内无法进行FTP的问题

附一例子:

用MFC 提供的CInternetSession、CFtpConnection进行FTP连接

CInternetSession test(_T("test"));
try
{
CFtpConnection *pFtpConn=test.GetFtpConnection(_T("127.0.0.1"),NULL,NULL,21,TRUE);
CFtpFileFind FileFind(pFtpConn);
if (FileFind.FindFile(_T("*")))
{
AfxMessageBox(_T("该目录存在文件!"));
}
else
{
AfxMessageBox(_T("该目录不存在文件!"));
}

}
catch(CInternetException * m_pException)
{
cout<<"error!"<<endl;
}


如果在CFtpConnection *pFtpConn=test.GetFtpConnection(_T("127.0.0.1"),NULL,NULL,21,TRUE);中将最后的参数TRUE设为

默认(即FALSE),大多数情况下会连接错误,因为FALSE代表采用主动方式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: