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 //密码为sandyTYPE I \r\n SIZE sandy.txt \r\n //如果sandy.txt文件存在,则返回该文件的大小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进行多线程和断点续传文件下载了。