游子的博客
慈母手中线,游子身上衣, 临行密密缝,意恐迟迟归, 谁言寸草心,报得三春晖。 数据读取中,请稍候......
posts - 337,  comments - 546,  trackbacks - 0
http://publishblog.blogchina.com/blog/tb.b?diaryID=3790095

现在有不少软件可实现多线程下载.NetAnts,JetCar,其实多线程下载的原理并不复杂,主要的两项技术就是多线程和断点下载。程序中开启多个线程,每个线程利用断点下载,分别下载文件的不同部分,下载完后合并,就可以了。多线程编程很多书已有介绍,这里不再重复,关于断点下载,MFC中提供的CInternetFile类可实现HTTP的断点下载,但无法实现FTP的断点下载。因此,我们只好从FTP协议中的命令入手,自己编写个FTP类,来实现多线程下载。本人编写的CMultiFTP类(在WIN2000+IIS50下测试成功)已在CSDN发表。

FTP指令的详细信息,大家可从http://info.internet.isi.edu/in-notes/rfc/     处获得,这里给大家介绍下与多线程下载有关的几个指令极其格式:

USERUSERNAME〉:登陆FTP的用户名,执行成功返回220

PASSPASSWORD〉:密码,执行成功返回230

RESTPOS〉:指定文件下载的开始位置,执行成功返回350

SIZEFILENAME〉:文件大小,执行成功返回213

PASV:建立数据连接,同时取得FTP服务器下载文件时用的端口号,执行成功返回227

TYPE:指定下载文件的类型,参数为I是二进制文件,为A是字符文件,执行成功返回200

RETRFILENAME〉:下载文件,执行成功返回125

这些命令中,RESTRETRSIZE三个命令最关键,在后面会给大家更详细的说明,另外执行FTP命令,FTP服务器会向客户端返回一代码,命令执行成功的代码上面已给出。向服务器发送命令,可把命令当作字符串向服务器发送,如:send(socket,”rest 100 ”,…)(注意:要在命令后加 )

在介绍多线程下载前,先给大家介绍下连接FTP服务器和从FTP服务器下载文件的过程。连接FTP SERVER很简单,创建一套接字,指定服务器的地址和端口号,连接到服务器,再向它发送USERPASS命令,服务器返回230,就代表登陆成功,并且服务器和客户建立了一控制连接。

FTP服务器下载文件的过程比较复杂。首先,客户端要和服务器建立一数据连接,可用PORTPASV命令建立数据连接,PORT命令要自己指定一端口号用于下载,PASV命令则由服务器分配一端口号,客户端可从服务器的返回信息提取端口号,返回信息的格式为:

(服务器IP,端口号),本人的程序将使用PASV命令。然后向服务器发送RETR命令下载文件,或先发送一REST命令指明从哪下载文件。之后,要建立一新的套接字,连接到数据连接指定的端口,文件数据就从这个套接字下载。下载完毕后,关闭套接字。

现在进入本篇的精华,实现多线程下载。执行完登陆操作后,先发送“REST 100”命令,测试下服务器是否支持断点下载,如返回成功代码,就可实现多线程下载;然后发送“SIZE”,取得文件的大小,根据文件大小,将文件分为几部分,记下各部分的偏移地址,并作为参数,交给各线程去下载。在下载线程中,先接受主线程传给他的参数(文件名,偏移地址,保存地址等),再发送“PASV”命令,建立数据连接,并新建一套接字连接到新的端口;然后根据文件类型,二进制文件发送“TYPE  I“命令,文本文件发送”TYPE  A“命令;之后发送“REST  〈文件偏移地址〉”命令,通知服务器改变将要下载的文件的开始地址;最后,执行“RETR 〈文件名〉”命令,下载文件。下载完毕后,编段代码合并文件即可。

在这里有个问题,就是主线程如何得知各下载线程已执行完毕。WINDOWS提供了几种线程互斥技术,如CriticalSection,Mutex等,关于他们的详细信息,大家可参考各种编程书籍,在这里我推荐使用CriticalSection技术。可以在程序中建立一全局计数器,在文件下载前置零,并建立一全局CriticalSection变量。在下载线程中,当文件下载完毕后,先锁定全局CriticalSection变量,之后将计数器加一,再释放全局CriticalSection变量。主线程中,可建立一定时,定期检查计数器的值,或让下载线程在下载完毕后调用主线程的某个函数。这样,主线程就可随时发现文件已下载完毕,可合并文件了。

多线程下载的程序设计就是这样,一点都不难。看来掌握某些计算机技术,特别是网络技术,最好还是从实现原理入手,掌握其最精华的部分,激发自己的灵感,编写出个优秀软件。老停留在使用别人的组件和函数库的基础上,你的水平不会有太大提高。

posted on 2006-06-23 14:44 游子 阅读(330) 评论(1)  编辑 收藏 引用 所属分类: 软件

FeedBack:
# re: 转载----实现FTP多线程下载
2006-06-29 10:16 | 萌芽的叶子
對了,你是用什麼工具開發的?
我的gmail是piaoye123@gmail.com ,這個可以在線聊天,和msn差不多

我目前用vs 2005有很多語法改了,不知道function的對應語法是什麼,  回复  更多评论
  
只有注册用户登录后才能发表评论。

欢迎大家扔鸡蛋!送鲜花!

博客可以收入过千吗?

<2006年6月>
日一二三四五六28293031
12345678910111213141516171819202122232425262728293012345678

常用链接

留言簿(8)

随笔分类(314)

随笔档案(337)

文章分类(7)

文章档案(10)

相册

收藏夹(1)

其它

友情链接

数字电视

生活、旅游

自己的链接

计算机

搜索

  •  

积分与排名

  • 积分 - 403585
  • 排名 - 9

最新评论

阅读排行榜

评论排行榜