一个Http多线程下载与断点续传的DLL

由于做东西需要,所以写了这个小工具,喜欢的朋友就收下吧。

此Dll就是导出一个下载函数,支持多线程与断点续传。纯socket实现,参考了很多代码。还是比较有学习价值。

没有经过严格测试,应该会有 BUG,里面有一个多线程操作downloaded+=nLen的代码段应该加锁的,但是考虑到downloaded只是用于统计下载速度,不影响整体核 心。所以没加锁。貌似也没啥错误。。经测试一般开启3,4个线程可达最佳下载速度,多了反而很慢甚至无法下载。

与迅雷比较了一下,平均速度好像要快一点。。。因为我用控制台程序测试的。。。

一个Http多线程下载与断点续传的DLL_第1张图片

函数使用方法如下:
            bool fnMyDownload(  CString strUrl,
                CString strWriteFileName,
                unsigned long *& downloaded,
                unsigned long & totalSize,
                CString strProxy,
                int nProxyPort,
                int nThread
                )


strUrl:                       需要下载的文件地址,  如:“http://10.20.1.6/musiconline/091029/daisy.mp3 ”
strWriteFileName:    下载后文件的存放地址,如:“d://”
downloaded:           指针引用,调用函数后会不断变化,实时反映已下载多少字节的数据
totalSize:                传递引用,表示所要下载文件的总长度,与downloaded配合可以分析各种下载信息

strProxy,nProxyPort  这两个为代理选项,有的话填上,如"192.168.1.89",8080  没有的话麻烦点填上"",0 。因为我不知道Dll导出函数怎 么定义默认参数。。。囧。

nThread:                用于下载开启的线程数,一般3,4个最佳。。太多反而降低速度,而且有些服务器不支持多连接。

例:fnMyDownload("http://10.20.1.6/musiconline/091029/daisy.mp3","d://",downloaded,totalSize,"",0,3)

补充一个,下载url应该不支持中文与空格,有心的GG写一个url编码函数加进去吧。。:)

 

最后还是简单说下断点续传与多线程下载的原理吧。

Http1.1版本提供了断点续传功能:Range header,这个功能允许下载某个范围的数据,所以,Range header使得被中断的下载可以从中断的那个点重启。当涉及到HTTP下载请求时,报头是伴随着这个请求信息的,如Range: bytes = start-end。start指定了这个范围的开始,end指定了结尾,如果没有end,这个范围从开头到文件的结束。

断点续传原理即是:当下载中断时,获得已经下载的字节数(可读取下载文件实现)。然后发送Range: bytes = position-

多线程下载原理也差不多:首先获得需要下载文件的大小,根据开启线程数来将这些文件分成几个部分,每个线程负责一个文件块,也是充分利用Range报头,其中每个线程使用一个socket连接,所以这是多连接的,可能某些服务器不支持。

最后关于速度瓶颈: 应该就是下载数据与写入数据的同步性了。可以把下载数据与将数据写入文件分成2个线程来工作,用一个加锁队列来负责他们的数据交换。理论上可以快很多,具体可参考《编程之美》P59。

打包下载地址:download.csdn.net/source/1787322

你可能感兴趣的:(多线程,socket,测试,服务器,header,dll)