FTP协议解析与实现

发表于:2007-07-01来源:作者:点击数: 标签:
关键词:FTP、协议解析、visual C++ 简述: 在学习FTP协议偶有感悟,于是想起了写一篇文章来总结一下自己学习的东西。同时也想与读者共同分享自己的劳动成果,也算是抛砖引玉吧。错误和不当之处欢迎指正。联系方式:。本文主要对 程序员 关心的一些技术进行了


关键词:FTP、协议解析、visual C++

简述:

       在学习FTP协议偶有感悟,于是想起了写一篇文章来总结一下自己学习的东西。同时也想与读者共同分享自己的劳动成果,也算是抛砖引玉吧。错误和不当之处欢迎指正。联系方式:。本文主要对程序员关心的一些技术进行了总结。并结合一个实例来进一步说明。本文涉及内容主要是FTP原理、VC编程、Socket等。

正文:

一、FTP通信原理简述

1.1 FTP简介

       FTP是基于TCP/IP协议的一个应用协议。主要实现在不同的计算机之间的数据共享。FTP 采用的是C/S模式。客户既可以下载文件也可以上传文件。当然,FTP给用户一定的权限。用户只能在权限下使用。目前,FTP的服务器种类很多,比如常用的SERV-U,客户端程序也很多,比如:CuteFTP。WINDOWS也提供了一个FTP客户程序。它们都根据相同的协议标准来设计的,具体协议内容可参考RFC文档。

SERV-U工作界面

windows提供的客户端

1.2  FTP工作原理

       FTP工作原理与其它的应用协议有些不同。它是用两个端口进行通信的。一个端口用于命令交互。这个端口在用户连接之后一直保持;而另一个端口只是在数据传时打开(比如:上传文件,下载文件,获取服务端文件列表),在数据传输时有两种不同的模式,一是用户开通这个数据端口,这种模式叫做主动模式;二是服务器提供一个接口,这个模式叫被动模式。

FTP原理图

1.3 用户登录

       FTP服务器提供了用户的访问权限,有的服务器可以匿名登录,有的服务器要求用户使用密码登录。在每一个与登录有关的命令时,服务器都会有一个返回信息。

       下面显示了一个登录过程:

1.4 数据传输

              在FTP中可以定义数据的传输格式,比如:二进制(进行图象和应用程序传输这种格式)。下面是一个传输过程:

二、FTP命令

在WINDOWS中提供的命令不是FTP的标准命令。有些命令是许多命令的合集。而FTP标准命令,每发送一个,服务器就会做出一个相应的动作,并把认证信息发送给用户。

具体的命令可以参照有关的资料

三、实例

在这里我们用一个FTP客户端来说明以上的知识。这里面主要是一个封装的类。

CFTPClient这个类实现的文件的上传与下载并能获得服务端文件的信息。

1.1 CFTPClient类

 

clearcase/" target="_blank" >cc66 0.75pt outset; BORDER-TOP: #ffcc66 0.75pt outset; BACKGROUND: #dadacf; BORDER-LEFT: #ffcc66 0.75pt outset; WIDTH: 90%; BORDER-BOTTOM: #ffcc66 0.75pt outset; mso-cellspacing: 1.5pt" cellPadding=0 width="90%" bgColor=#dadacf border=1>

class CFTPClient

{

//成员变量

private:

       CSocket *m_pSocket;

       CArchive *m_pRxarch;

       CArchive *m_pTxarch;

       CSocketFile *m_psfSokFile;

 

       CString m_strMsg;//服务器发回的消息

 

       CString m_fc;

 

       CftpclientDlg  *m_pWnd; //用于对窗口的操作

       CByteArray m_btBuf;

//成员函数

public:

       CFTPClient(void);

       ~CFTPClient(void);

 

       //发送命令到服务器

       BOOL FtpCommand (CString strCommand);

       //登录到FTP服务器,这个函数只支持在没有防火墙的时候

       BOOL LogOnToserver ( CString strHostname , int nHostPort , CString strUserName , CString strPassword );

       //退出服务器

       void LogOffServer();

 

       //上传下载文件

       BOOL MoveFile (CString strRemoteFile,CString strLocalFile , BOOL bPasv , BOOL bGet);

 

       //列出文件列表

       BOOL List();

       void ProcessList();

      

       //获取一行信息

       BOOL GetLine(int ndx,CString &strLine);

 

       //发送数据

       BOOL WriteStr(CString strOutPut);

       //接收数据

       BOOL ReadStr();

 

 

       //设置窗口

       void SetWnd(CftpclientDlg  *pWnd);

       //发送信息

       void SetMessage(CString strMsg);

       //获取文件信息

       BOOL GetFtpFileInfo(int ndx,FTP_FILE_INFO &ftpFileInfo);

protected:

       //读取服务器发送的信息

       BOOL ReadStr2();

 

       //打开通道

       BOOL OpenControlChannel(CString strServerHost , int nServerPort);

       //关闭通道

       void CloseControlChannel();

 

             

 

 

};

原文转自:http://www.ltesting.net