本文建立在你对socket知识有一点点的基础之上(有一点点就足够了:))
 
      FTP客户端实现要建立两个通道,一个控制命令通道,让FTP服务器知道客户端要干什么,一个数据传输通道。所谓的两个通道只不过是两个调用了connect函数的连接,只是控制命令通道专门用来传输一些字符串命令信息,而数据通道则是用来传输文件。控制命令通道一定是由客户端向服务器的连接(默认的端口是connect下载21,也可以指定端口,这要看服务器的设置)。连接的过程完成了FTP的登录。数据通道则不一定啦,具体哪个连哪个,请看下面对PASV命令的解释。
 
  其实FTP断点续传的原理很简单,可分为断点下载和断点上传。
       
  客户端的实现步骤如下:
 
一、下载:
1、向服务器发送“REST + 本地文件长度”命令,告诉服务器,客户端要断点下载了。这时服务器还不知道客户端要下载哪个文件;
2、向服务器发送“RETR + 文件名”命令,通知服务器要下载的文件名,这时服务器开始定位文件指针读文件并发送数据。
3、客户端定位本地文件指针(文件末尾);
4、两端的准备工作都做完了以后,客户端创建socket,以被动或非被动方式建立数据通道,循环调用recv接收数据并追加入本地文件;
 
二、上传:
1、获取服务器上和本地要上传文件的同名文件大小;
2、向服务器发送“APPE 文件名”,通知服务器,接下来从数据通道发送给你的数据要附加到这个文件末尾。
3、定位本地文件指针(和FTP上文件大小相同的位置)
4、从文件指针处读数据并发送。

  了,FTP断点续传的原理就这么简单。代码里将断点上传和断点下载放到同一个函数(MoveFile)里,通过get参数说明是上传还是下载。当然,整个 FTP类的实现有800多行,包括登录、退出、获取FTP文件大小、删除FTP服务器上文件、响应服务器,解析响应信息等函数。相应的注释代码里都有,这 里就不一一熬述了。
 
这里重点说说PASV模式,即被动模式,这是FTP命令里比较不容易理解的一个,这条命令请求服务器在某个端口(非FTP默认端口或控制命令端口)创建一个监听socket,服务器创建的端口号会在客户端的控制命令通道上得到响应。得到这个端口号后,客户端就可以创建
新的socket(数据通道)connect过去,并进行文件传输等工作。否则,如果为非被动模式,那么监听的socket由客户端创建,服务器connect过来。
对于这条命令的存在我是这么理解的,存在这么一种情况:客户端的IP是个内网的IP,服务器的IP是个外网的,当进行数据传输时内网的IP对于服务器是不可见的,只有由服务器启动监听socket才能建立数据通道,所以必须以被动模式进行。:)
FTP和HTTP断点续传的道理

第一,最重要的一点,断点续传需要服务器的支持,这个是必要条件。
传统的FTP SERVER是不支持断点续传的,因为它不支持REST指令,传统的FTP指令(我是指服务器端指令)并不包括REST指令。

第二,客户端要知道使用REST等一系列指令来作断点续传。


看看断点续传的详细过程(FTP SERVER):
首先客户端使用REST指令来告诉FTP SERVER它需要从文件的某个点开始传,接着用STOR或者RETR命令开始传文件,大概的命令的流程如下:

TYPE I
200 Type set to I.
PASV
227 Entering Passive Mode (204,48,18,69,98,250)
REST 187392
350 Restarting at 187392. Send STORE or RETRIEVE to initiate transfer.
RETR /pub/audio/pci/maestro-3/win2k/1056.zip
150 Opening BINARY mode data connection for /pub/audio/pci/maestro-3/win2k/1056.zip (936098 bytes).

首先使用TYPE命令告诉FTP SERVER使用BINARY模式传送文件;
然后使用PASV命令告诉FTP SERVER使用被动打开模式来传送文件;
接着使用REST 187392指令告诉FTP SERVER要从文件的187392字节开始传送;
最后使用RETR指令来传送文件。

从上面可以看出,这个FTP SERVER支持REST指令,有的FTP SERVER(特别的老的)是不支持这个指令的,这时即使FTP CLIENT支持断点续传也一点用都没有!

支持断点的FTP SERVER:Serv-U FTP,还有一系列的新出现的FTP SERVER;
不支持断点的:IIS4以前版本所带的都不行,IIS5 有,不家可以测试一下,登录进FTP SERVER,然后输入REST 1000命令,看服务器是否认识,认识就是支持断点。


上面说的是FTP SERVER的断点,HTTP的断点续传是这样的:
在以前版本的HTTP SERVER也是不支持断点的,HTTP/1.1开始就支持了,具体如下:


在HTTP请求的头部信息里面,通常是这样的:

GET x/index.html HTTP/1.1
Host:www.163
Accept:*/*

上面是HTTP请求头的主要内容,是浏览器等客户端发给HTTP SERVER的信息。
在这个请求头里面,第一行叫做Request Line,GET叫做请求方法(通常得到一个HTML页面都是用GET,CGI等请求是用POST),/index.html是URL,HTTP/1.1为版本号。
是HTTP服务器名字,这也是HTTP/1.1的新东东,以前做虚拟主机可是要一个主机名对应多个IP,现在好了......呵呵,这个离题太远,不说了)

要做断点续传,浏览器等客户端需要在请求头里面发送
Range: bytes=1140736-
这样的请求,就是告诉HTTP SERVER,这个文件要从1140736字节开始传送。


最后一点,大家看了上面的描述可能会有一个问题,那么多点传送怎么做呢?那就是多起几个线程,连接到服务器,用断点指令来传送文件,在传送的过程 中,会检查前面的(比如说第一个蚂蚁)得到的文件的部分是否超过了后面的(比如说第二个蚂蚁)的起点,相等就停前面的蚂蚁,最后再合并几个部分,就得到一 个完整的文件了
介绍可以断点续传软件FTP EXPLORER
经过比较,觉得FTP Explorer还是不如CuteFTP来得方便,但它最大的优点是免费不用注册,所以也值得一试。
FTP EXPLORER的主要特点是:(使用图解看这里
1. 支持断点续传:当由于线路中断而导致下载的文件中断时,
FTP EXPLORER可以通过TRANSEER MANAGER
(传输管理器)帮助你在下次登录时从上次中断的地方继续下载文件,这将节省你大量的时间和通讯费
用。传输管理器允许你迅速了解下载或上载文件的详细信息,如FTP位置、下载状态、下载的目的地
等。当文件下载完毕,文件左边的标记变蓝;当文件传输时因故中断,文件左边的标记为黄;当文件
传输地因故中断,文件左边的标记变红;这时,只要在中断的文件名上单击鼠标右键,就可以看到一个
对话框,CANCEL表示取消文件传输,RESUBMIT表示进行断点续传。
2. 类似
Windows 95中的资源管理器,界面友好。不同的是它显示的是远方FTP站点服务器的内容。
(见下图)
3. 自动联接:当联机请求被拒绝时(有的热门
FTP站点限制访问人数),FTP EXPLO RER能够自动重新与暂
时拥挤的FTP站点建立联接,而且可以自由设定重新联接的次数(最多为99次)和时间间隔
(如隔90
后进行重拨)。一旦联机成功,FTP EXPLORER会自动提示用户。
4. FTP EXPLORER
全面支持拖放功能(Drag an Drop),可以将文件拖到你指定的位置甚至桌面上并可以在桌
面上建立捷径。
(注这些功能另一个也支持断点续传功能的著名软件CUTEETP也有,
CUTEETP的注册版本才具有断点续传功能)。
FTP EXPLORER网址:ftp://ftp.ftpx/pub/lang/ www.ftpx/
ftp下载的好处我在这里就不多说了,许多工程会把ftp下载作为一个重要的功能来实现。微软提供的WinInet类可以利用下面这些函数:
  InternetOpen;
  InternetConnect;
  GetCurrentDirectory;
  SetCurrentDirectory;
  FtpGetFile;
  很容易实现ftp的下载,网上关于这方面的文章也很多。但是要实现ftp的多线程下载,利用这些函数就显得有些牵强了。用socket根据 ftp协议来开发将会变的十分灵活。下面我就逐步的讲解整个开发的过程:开发环境 BCB(组件模式),VC 环境下请自行稍作改动。看了这篇文章后对于BCB开发人员来说,不仅可以对 FlashGet 等软件的开发原理有一定的了解,特别是在开发组件方面也有很大的指导作用,请耐心的将它看完。很简单!!
  首先介绍一下部分ftp协议:
图一 FTP服务示意图
  用户FTP和服务器FTP之间要传送文件,需要有两个连接:命令通道和数据连接,从名字上就可以看出命令通道是传送命令的,数据通道是用于传送文件。服务器与服务器之间的数据
传送在此就不多作解释。
  主要用到的命令为:USER,PASS,TYPE,SIZE,REST,CWD,PWD,RETR,PASV,PORT,QUIT;
  USER:参数是标记用户的Telnet串。用户标记是访问服务器必须的,此命令通常是控制连接后第一个发出的命令,有些主机还会要求口令和帐 户。服务器可以在任何时间接收新的USER命令以改变访问控制和(或)帐户信息。这可以重新开始登录过程,所以传输参数不变,在进行中的文件传输在过去的 访问控制参数下完成。
PASS:参数是标记用户口令的Telnet串。此命令紧跟USER命令,在某些站点它是完成访问控制不可缺少的一步。因此口令是个重要的东西,因此不能显示出来,服务器方没有办法隐藏口令,所以这一任务得由用户FTP进程完成。
  TYPE:参数指定表示类型。有些类型需要第二个参数,第一个参数由单个Telnet字符定义,第二个参数是十进制整数指定字节大小,参数间以<SP>分隔。下面是格式:
图二 TYPE参数示意图
  默认表示类型是ASCII非打印字符,如果参数未改变,以后只改变了第一个参数,则使用默认值。
  SIZE:参数从FTP服务器上返回指定文件的大小。
  REST:参数域代表服务器要重新开始的那一点,此命令并不传送文件,而是略过指定点后的数据,此命令后应该跟其它要求文件传输的FTP命令。
  CWD:此命令使用户可以在不同的目录或数据集下工作而不用改变它的登录或帐户信息。传输参数也不变。参数一般是目录名或与系统相关的文件集合。
  PWD:改变当前的工作目录。
  RETR:开始传送指定的文件。(从REST参数指定的偏移量开始传送)
  PASV:此命令要求服务器DTP在指定的数据端口侦听,进入被动接收请求的状态,参数是主机和端口地址。
  PORT:参数是要使用的数据连接端口,通常情况下对此不需要命令响应。如果使用此命令时,要发送32位的IP地址和16位的TCP端口号。上面的信息以8位为一组,逗号间隔十进制传输。
  QUIT:退出登录。
  各个参数的具体用法举例如下:

USER sandy \r\n //用户名为sandy登录
PASS sandy \r\n //密码为sandy
TYPE I \r\n
\r\n //如果文件存在,则返回该文件的大小
REST 100 \r\n //重新指定文件传送的偏移
CWD infor/ \r\n //获取当前的工作目录
PWD temp/ \r\n //改变当前的工作目录
RETR \r\n //开始传送文件
PASV \r\n //进入被动模式
PORT h1,h2,h3,h4,p1,p2 \r\n //进入主动模式,h1,h2,h3,h4为ip地址的4个部分。p1,p2是16进制的端口号
  下面介绍一下各个函数的使用顺序和一些应注意的地方:
  使用这些命令的前提条件是客户端和服务器端建立了连接。比如ftp服务器地址:192.168.1.81 ,端口:21。那么利用Winsock的API函数建立socket连接,然后使用USER,PASS登陆FTP服务器.需要下载文件,要确保文件必须在 当前工作目录下,可以使用命令CWD和PWD。查看和更改当前的工作目录。使用SIZE命令获取文件的大小。我们想要多线程下载那么就要求服务器支持该功 能。一般我们都会在开头先使用REST命令判断该ftp站点是否支持多线程下载。PORT和PASV两个命令是用来建立数据连接的。他们的主要区别 是:PORT需要你指定一个ip地址和端口与服务器建立连接。PASV命令服务器会返回h1,h2,h3,h4,p1,p2样式 的数据供客户端连接。等数据连接建立后,就可以了使用REST,RETR进行多线程和断点续传文件下载了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。