使用ACE制作FTP下载客户端

来源:互联网 发布:淘宝店铺店招图片950 编辑:程序博客网 时间:2024/05/16 06:48

第一次使用ACE不明白的地方很多,除了参考网上的资料还有就是《C++网络编程 卷1 运用ACE和模式消除复杂性》和《ACE程序员教程》

制作ftp客户端首先需要明白的是ftp是什么东西,ftp是一种文件传输协议,使用21端口。既然他是规定好的协议,那我们只需要了解他的命令就可以了。ftp指令我不一一罗列了,只列出本次开发中需要使用的如下:

接着我们考虑这个客户端的流程是怎么样的。首先客户端需要通过21端口去请求服务器,那么就需要一个用来连接用的socket然后进行连接,ACE为我们封装了一个客户端的连接器ACE_SOCK_Connector,通过这个就可以去连接服务器了。此外还需要一个ACE_SOCK_Stream对象用来传输数据。这样我们就可以和服务建立通道通信了,代码如下

这样我们就可以在这条信道上发送指令给服务器,并接收服务器返回数据。

服务器会在客户端建立成功后发"220"指令,表示已经建立成功。

接着我们需要告诉服务器我们需要登录,于是我们告诉服务器我们的用户名和密码,通过之前建立的信道peer_用USER和PASS指令传过去:

"USER xiaojin"

"PASS 123456"

我们回收到服务器返回,返回值参照上面指令表。

在通过服务器验证之后我们就可以下载数据了。

这是需要发送"PASV"指令告诉服务器需要开启被动模式,关于被动模式参考http://blog.csdn.net/zjcode/archive/2010/02/26/5329171.aspx

如果被动模式开启,服务器会返回一个新的服务器地址,用于建立一条新的数据通道。

用和建立第一条通道一样的新的数据通道,这时候我们就有了两条信道,一条用来传指令,一条用来接收数据。

命令通道发送"RETR 文件名",成功后数据通道就有接收到数据了。

接收到数据后,还有个步骤就是写入本地文件,使用ACE_FILE_IO和ACE_FILE_Connector操作文件写入。

这样整个流程就完成了。

断点传输:

之前一直不理解什么叫断点传输,做这个东西才明白,服务器能从一个文件的任意一个位置开始传就叫断点传输。

这个功能需要服务器支持。

有这个功能是一件很有创意的事情,我们可以实现文件续传,可以实现文件分片下载。但是之前需要知道怎么样客户端才能去请求断点下载。答案就是"REST 100"指令,后面的数字标识偏移量。如果服务器返回350则表示服务器支持断点功能,否则就不支持。这些创意也无从谈起了。

我的服务器支持断点,于是我要做一个断点功能。

首先通过"size 文件名"命令获取文件大小,然后每次下载开始钱先检查下这个文件是不是已经存在与本地。

ACE提供了一个很简单的方法

ACE_OS::access返回值小于0则该文件不存在。

如果这个文件已经存在了,那么先读取这个文件的大小使用

ACE_FILE_Info和 ACE_FILE_IO配合获取文件的信息

然后就已文件大小为偏移量告诉服务器要从该位置下载,这里需要注意的是"REST"指令只指示偏移而不下载,我们还是需要"RETR"。

接下来就是判断了,看看文件是否已经下完,没下完继续,下完就结束了。

至于分片下载,道理和断点续传一样的,只是用多线程实现会加快下载速度。根据文件大小分成几片,分几个线程同时下载。当所有分片下载完成之后,再组合在一起成一个文件。用ACE_TASK做主动对象使用可以在下载完成时获取结果,不知道我这种方法对不对。

通过这个小工程我收获还是不少的,至少对ACE有了个模糊的认识,ACE是个好东西还是要好好的学学。

最后请各位看官不吝指教。

原创粉丝点击