设为首页 收藏本站
查看: 1075|回复: 0

[经验分享] Ftp客户端概要设计

[复制链接]

尚未签到

发表于 2016-6-8 11:31:08 | 显示全部楼层 |阅读模式
  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.模块设计
      根据概述中的说明,建立如下的模块关系:
   DSC0000.jpg

  
      对外操作的接口最终转入控制实例中操作。对于外部传入的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

  如果需要动态库(共享库)请以邮件的方式联系作者。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-227816-1-1.html 上篇帖子: ftp文件读取上传 下篇帖子: 什么是FTP?FTP端口号是多少?FTP的端口号能改吗?ftp的端口号20、21有何区别?ftp命令?...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表