|
Ftp客户端概要设计
1.概述
ftp是基于TCP的文件传输协议,主要是用于控制远程文件,如下载、上传、续传、重命名、删除等。其命令是基于可见字符,易于理解的方式交互的。客户端与服务器端的交互遵循一应一答的方式,而且各命令间遵循一定的顺序。
FTP的应答原则:
a.所有应答都以3个数字开头以“\r\n”结束
b.一个应答的第4位如果为’-’,表示还有后续应答,说明一个命令对应了多个应答
c.对应一个命令的多个应答,其前面的3个数字一样
d.非命令的传输都需要开通另外的通道,并且事先需要说明是主动还是被动
FTP客户端需要实现的功能:
a.登录、退出
b.列出指定路径下的所有文件名称
c.下载文件
d.上传文件
e.续传文件(上传和下载)
f.创建目录
g.重命名文件
功能要求:
a.同时可以上传和下载多个文件,并不相互影响;
b.随时可以终止正在上传或下载的文件,并后续续传;
c.在上传和下载的过程中不影响其他命令的执行;
d.上传和下载文件可以显示进度信息
2.模块设计
根据概述中的说明,建立如下的模块关系:
对外操作的接口最终转入控制实例中操作。对于外部传入的ftp基本信息(如服务器名、端口号、用户名密码等信息)需存入基本信息模块。操作模块依赖基本信息模块和传输控制模块。一个操作模块完成简单的一次操作,如列出文件列表、上传文件、下载文件。如果需要多个上传或者下载操作则创建多个操作模块。
控制实例的主要作用是:有效组织一个或多个操作模块。
3.接口设计
由于时间关系,这边实现概述中部分功能。
/**
* 设置当前字符集
*/
bool SetCharset(char* charSet);
/**
* 登录ftp服务器
*@host 主机名称,IP地址或者域名
*@port ftp服务器端口,默认可以填21
*@userName ftp用户名,为NULL表示匿名登录
*@password 用户名对应的密码
*@return 登录成功返回true,否则返回false
*/
bool Login(char* host,unsigned shortport,char* userName,char* password);
/**
* 退出ftp服务器,会中断所有传输操作
*@return 登录成功返回true,否则返回false
*/
bool Logout();
/**
* 创建目录
*@dirPath 以'/'开头,必须为绝对路径
*/
bool Mkdir(char* dirPath);
/**
* 将本地文件上传到服务器上
*@localFile 本地文件
*@remoteFile 服务器的文件(绝对路径)
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄,通过该句柄可以终端传输等
*/
int PutFile(char* localFile,char*remoteFile,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 将内存中的数据上传到服务器上的文件中保存
*@buffer 内存中的数据
*@nLen 数据长度
*@remoteFile 服务器的文件(绝对路径)
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄
*/
int PutBuffer(BYTE* buffer,int nLen,char*remoteFile,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 获取下载服务器上的文件
*@remoteFile 服务器上的路径(绝对路径)
*@localFile 本地文件路径
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄
*/
int GetFile(char* remoteFile,char*localFile,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 下载服务器上的文件到指定的内存中
*@remoteFile 服务器上的文件(绝对路径)
*@buffer 指定的内存
*@nLen 可用的内存大小
*@callback 传输回调函数,参考FtpTransferCallback的定义
*@lpcontext 回调函数的上下文参数
*@return 返回控制句柄
*/
int GetFileToBuffer(char* remoteFile,BYTE*buffer,int nLen,FtpTransferCallback callback,LPVOID lpcontext);
/**
* 在ftp服务器上查找相应的文件
*@findFile 需要查找的文件(绝对路径),查找绝对路径下的所有文件
*@return 成功返回查找到的文件个数
* 没有找到文件则返回0
*/
int FindFile(char*findFile);
/**
* 获取下一个文件信息
*@lpFileInfo 文件属性
*@return 成功返回true,遍历完或失败返回false
*/
bool NextFile(OUT LPFtpFileInfolpFileInfo);
附件1 FTP命令表:
命令
| 描述
| ABOR
| 中断数据连接程序
| ACCT <account>
| 系统特权帐号
| ALLO <bytes>
| 为服务器上的文件存储器分配字节
| APPE <filename>
| 添加文件到服务器同名文件
| CDUP <dir path>
| 改变服务器上的父目录
| CWD <dir path>
| 改变服务器上的工作目录
| DELE <filename>
| 删除服务器上的指定文件
| HELP <command>
| 返回指定命令信息
| LIST <name>
| 如果是文件名列出文件信息,如果是目录则列出文件列表
| MODE <mode>
| 传输模式(S=流模式,B=块模式,C=压缩模式)
| MKD <directory>
| 在服务器上建立指定目录
| NLST <directory>
| 列出指定目录内容
| NOOP
| 无动作,除了来自服务器上的承认
| PASS <password>
| 系统登录密码
| PASV
| 请求服务器等待数据连接
| PORT <address>
| IP 地址和两字节的端口 ID
| PWD
| 显示当前工作目录
| QUIT
| 从 FTP 服务器上退出登录
| REIN
| 重新初始化登录状态连接
| REST <offset>
| 由特定偏移量重启文件传递
| RETR <filename>
| 从服务器上找回(复制)文件
| RMD <directory>
| 在服务器上删除指定目录
| RNFR <old path>
| 对旧路径重命名
| RNTO <new path>
| 对新路径重命名
| SITE <params>
| 由服务器提供的站点特殊参数
| SIZE <filename>
| 获取服务器上文件的大小
| SMNT <pathname>
| 挂载指定文件结构
| STAT <directory>
| 在当前程序或目录上返回信息
| STOR <filename>
| 储存(复制)文件到服务器上
| STOU <filename>
| 储存文件到服务器名称上
| STRU <type>
| 数据结构(F=文件,R=记录,P=页面)
| SYST
| 返回服务器使用的操作系统
| TYPE <data type>
| 数据类型(A=ASCII,E=EBCDIC,I=binary)
| USER <username>>
| 系统登录的用户名
|
附件2 FTP响应表:
响应代码
| 解释说明
| 110
| 新文件指示器上的重启标记
| 120
| 服务器准备就绪的时间(分钟数)
| 125
| 打开数据连接,开始传输
| 150
| 打开连接
| 200
| 成功
| 202
| 命令没有执行
| 211
| 系统状态回复
| 212
| 目录状态回复
| 213
| 文件状态回复
| 214
| 帮助信息回复
| 215
| 系统类型回复
| 220
| 服务就绪
| 221
| 退出网络
| 225
| 打开数据连接
| 226
| 结束数据连接
| 227
| 进入被动模式(IP 地址、ID 端口)
| 230
| 登录因特网
| 250
| 文件行为完成
| 257
| 路径名建立
| 331
| 要求密码
| 332
| 要求帐号
| 350
| 文件行为暂停
| 421
| 服务关闭
| 425
| 无法打开数据连接
| 426
| 结束连接
| 450
| 文件不可用
| 451
| 遇到本地错误
| 452
| 磁盘空间不足
| 500
| 无效命令
| 501
| 错误参数
| 502
| 命令没有执行
| 503
| 错误指令序列
| 504
| 无效命令参数
| 530
| 未登录网络
| 532
| 存储文件需要帐号
| 550
| 文件不可用
| 551
| 不知道的页类型
| 552
| 超过存储分配
| 553
| 文件名不允许
|
作者:wjh_2010@163.com
如果需要动态库(共享库)请以邮件的方式联系作者。
|
|
|