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

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

[置顶] Ftp客户端概要设计的更多相关文章

  1. 爱pia戏推出PC客户端,为您自动置顶窗口,方便查找

    爱pia戏推出PC客户端, 可以在无法使用插件的时候,使用PC客户端, 将为您自动置顶窗口,方便查看剧本. 百度网盘下载地址: 链接: http://pan.baidu.com/s/1pLpvn5p ...

  2. 自定义置顶TOP按钮

    简述一下,分为三个步骤: 1. 添加Html代码 2. 调整Css样式 3. 添加Jquery代码 具体代码如下: <style type="text/css"> #G ...

  3. [Winform]检测exe是否已经运行,并将其置顶

    摘要 在很多pc应用中,基本上都需要有这样的判断,保证在一个终端只运行一个winform的client.并且如果最小化了,用户再次双击桌面图标的时候,将client置顶显示. 解决方案 需要使用win ...

  4. mac内置的FTP工具

    在 Mac OS X 系统下,有不少优秀的 FTP 工具,如 Cyberduck.Transmit,但是你是否知道除了这些第三方应用,系统已经为你准备好了一个内置的 FTP 工具?/ M: e0 J% ...

  5. 在UWP中页面滑动导航栏置顶

    最近在研究掌上英雄联盟,主要是用来给自己看新闻,顺便copy个界面改一下段位装装逼,可是在我copy的时候发现这个东西 当你滑动到一定距离的时候导航栏会置顶不动,这个特性在微博和淘宝都有,我看了@ms ...

  6. WinFrom窗体始终置顶

    调用WindowsAPI使窗体始终保持置顶效果,不被其他窗体遮盖: [DllImport("user32.dll", CharSet = CharSet.Auto)] privat ...

  7. winform窗体置顶

    winform窗体置顶 金刚 winform 置顶 今天做了一个winform小工具.需要设置置顶功能. 网上找了下,发现百度真的很垃圾... 还是必应靠谱些. 找到一个可以链接. https://s ...

  8. ahk之路:利用ahk在window7下实现窗口置顶

    操作系统:win7 64位 ahk版本:autohotkey_L1.1.24.03 今天安装了AutoHotkey_1.1.24.03.SciTE.PuloversMacroCreator,重新开始我 ...

  9. Qt中让Qwidget置顶的方法

    一般来是说窗体置顶和取消只要        setWindowFlags(Qt::WindowStaysOnTopHint);        setWindowFlags(Qt::Widget); 要 ...

随机推荐

  1. Sqlite ContentProvider Loader 上下文 对话框

    一.整体工程图 二.activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/re ...

  2. 2014 International Conference on Robotics and Computer Vision (ICRVC 2014)

    2014机器人与计算机视觉国际会议ICRVC 与会地点:北京 与会时间:2014.10.24-26 截稿日期:2014-07-10 关于征稿: 语言:英文 主题: • Evolutionary Rob ...

  3. stm32之ADC

    将模拟量转换为数字量的过程称为模式(A/D)转换,完成这一转换的期间成为模数转换器(简称ADC);将数字量转换为模拟量的过程为数模(D/A)转换,完成这一转换的器件称为数模转换器(简称DAC). 模拟 ...

  4. 【ant项目构建学习点滴】--(3)打包及运行jar文件

    <?xml version="1.0" encoding="UTF-8"?> <project default="compile&q ...

  5. win7系统远程连接其它计算机,并且向远程机传输文件

    首先,打开开始菜单,在程序自带的 “附件“ 中找到 "远程桌面连接"并打开,出现远程桌面对话框: 其次,在对话框左下角点击“选项”,选择“本地资源对话框”,在本地设备和资源下点击“ ...

  6. 一个带动画效果的颜色选择对话框控件AnimatedColorPickerDialog

    android4.4的日历中选择日程显示颜色的时候有一个颜色选择对话框非常漂亮,模仿他的界面我实现了一个类似的对话框,而且带有动画效果. 代码的实现可讲的地方不多,主要是采用了和AlertDialog ...

  7. 使用ItextSharp产PDF完整操作

    原文 使用ItextSharp产PDF完整操作 记得上回有写到用C#操作Excel(.net 4.0) 很多朋友说推荐用NPOI,的确,用微软自带的操作execl会有很大的问题.客户的主机不愿意安装e ...

  8. unix shell: ksh fundamental(Korn Shell)

    Korn Shell 参考:ksh 学习 http://bbs.chinaunix.net/thread-1749811-1-1.html 1.语法 特殊的文件 /etc/profile 在登录时首先 ...

  9. linux命令:du,看文件大小

    du -s698 . (698字节)From <http://jingyan.baidu.com/article/a17d52855c10bf8098c8f2c9.html>

  10. JDK 环境变量配置(Mac)

    Mac JDK 安装过后 修改 ~/. bash_profile 配置环境变量 修改内容: JAVA_HOME=$(/usr/libexec/java_home) export JAVA_HOME P ...