社区
C++ 语言
帖子详情
求多线程下载源码
shenen
2007-03-14 09:05:44
rt
...全文
401
6
打赏
收藏
求多线程下载源码
rt
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pure_coder
2010-10-17
打赏
举报
回复
这里有个跨平台的,还能在手机上跑,我们公司买了,挺强的。
www.easygeteasy.com
Redsun248
2010-01-15
打赏
举报
回复
些话有理,若是有源程序参考就更好了
jixingzhong
2007-03-14
打赏
举报
回复
参考程序 :
http://www.vckbase.com/document/viewdoc/?id=319
jixingzhong
2007-03-14
打赏
举报
回复
http://www.cnblogs.com/bestcomy/archive/2005/02/03/31950.html
http://www.bytemen.net/dev/html/392.htm
现在有不少软件可实现多线程下载.如NetAnts,JetCar等,其实多线程下载的原理并不复杂,主要的两项技术就是多线程和断点下载。程序中开启多个线程,每个线程利用断点下载,分别下载文件的不同部分,下载完后合并,就可以了。多线程编程很多书已有介绍,这里不再重复,关于断点下载,MFC中提供的 CInternetFile类可实现HTTP的断点下载,但无法实现FTP的断点下载。因此,我们只好从FTP协议中的命令入手,自己编写个FTP类,来实现多线程下载。本人编写的CMultiFTP类(在WIN2000+IIS5。0下测试成功)
FTP指令的详细信息,大家可从http://info.internet.isi.edu/in-notes/rfc/处获得,这里给大家介绍下与多线程下载有关的几个指令极其格式:
USER〈USERNAME〉:登陆FTP的用户名,执行成功返回220;
PASS〈PASSWORD〉:密码,执行成功返回230;
REST〈POS〉:指定文件下载的开始位置,执行成功返回350;
SIZE〈FILENAME〉:文件大小,执行成功返回213;
PASV:建立数据连接,同时取得FTP服务器下载文件时用的端口号,执行成功返回227;
TYPE:指定下载文件的类型,参数为I是二进制文件,为A是字符文件,执行成功返回200;
RETR〈FILENAME〉:下载文件,执行成功返回125;
这些命令中,REST,RETR,SIZE三个命令最关键,在后面会给大家更详细的说明,另外执行FTP命令,FTP服务器会向客户端返回一代码,命令执行成功的代码上面已给出。向服务器发送命令,可把命令当作字符串向服务器发送,如:send(socket,”rest 100\r\n”,…)(注意:要在命令后加\r\n)。
在介绍多线程下载前,先给大家介绍下连接FTP服务器和从FTP服务器下载文件的过程。连接FTP SERVER很简单,创建一套接字,指定服务器的地址和端口号,连接到服务器,再向它发送USER和PASS命令,服务器返回230,就代表登陆成功,并且服务器和客户建立了一控制连接。
FTP服务器下载文件的过程比较复杂。首先,客户端要和服务器建立一数据连接,可用PORT或PASV命令建立数据连接,PORT命令要自己指定一端口号用于下载,PASV命令则由服务器分配一端口号,客户端可从服务器的返回信息提取端口号,返回信息的格式为:
(服务器IP,端口号),本人的程序将使用PASV命令。然后向服务器发送RETR命令下载文件,或先发送一REST命令指明从哪下载文件。之后,要建立一新的套接字,连接到数据连接指定的端口,文件数据就从这个套接字下载。下载完毕后,关闭套接字。
现在进入本篇的精华,实现多线程下载。执行完登陆操作后,先发送“REST 100”命令,测试下服务器是否支持断点下载,如返回成功代码,就可实现多线程下载;然后发送“SIZE”,取得文件的大小,根据文件大小,将文件分为几部分,记下各部分的偏移地址,并作为参数,交给各线程去下载。在下载线程中,先接受主线程传给他的参数(文件名,偏移地址,保存地址等),再发送 “PASV”命令,建立数据连接,并新建一套接字连接到新的端口;然后根据文件类型,二进制文件发送“TYPE I“命令,文本文件发送”TYPE A“命令;之后发送“REST 〈文件偏移地址〉”命令,通知服务器改变将要下载的文件的开始地址;最后,执行“RETR 〈文件名〉”命令,下载文件。下载完毕后,编段代码合并文件即可。
在这里有个问题,就是主线程如何得知各下载线程已执行完毕。WINDOWS提供了几种线程互斥技术,如CriticalSection,Mutex等,关于他们的详细信息,大家可参考各种编程书籍,在这里我推荐使用CriticalSection技术。可以在程序中建立一全局计数器,在文件下载前置零,并建立一全局CriticalSection变量。在下载线程中,当文件下载完毕后,先锁定全局CriticalSection变量,之后将计数器加一,再释放全局CriticalSection变量。主线程中,可建立一定时,定期检查计数器的值,或让下载线程在下载完毕后调用主线程的某个函数。这样,主线程就可随时发现文件已下载完毕,可合并文件了。
多线程下载的程序设计就是这样,一点都不难。看来掌握某些计算机技术,特别是网络技术,最好还是从实现原理入手,掌握其最精华的部分,激发自己的灵感,编写出个优秀软件。老停留在使用别人的组件和函数库的基础上,你的水平不会有太大提高。
百特门技术网 2004-11-1 16:31:23
todototry
2007-03-14
打赏
举报
回复
mark
dancing999
2007-03-14
打赏
举报
回复
关注下
客户端还是服务器阿?
C#
源码
大集合
第一部分 第一章 控件操作 第二章 文件管理 第三章 程序设置 第四章 系统维护 第五章 图像处理 第六章 数据库开发 第七章 网络应用 第八章 Web应用 ...第00部分 基础知道 ...第07部分
多线程
...
多线程
文档,实例
C#网络爬虫程序
源码
网上找的一个C#写的网络爬虫程序
源码
,支持
多线程
,上传上来方便自己查看,有需要的朋友可以直接拿去参考,呵呵~~~谢谢作者。
android单机斗地主
源码
不要分,但是希望大家
下载
了能评测下,做个评论好吗,谢谢支持,之前发了个java版的单机斗地主,受到大家的支持,现在又初学安卓,于是花了一个星期做了一个安卓版的斗地主,代码比之前有所优化,可能还是有待发现的...
WebService上传
下载
文件
用webservice作为服务器端,以流的方式实现文件的上传和
下载
,可以自动调用winrar进行压缩和加密,支持
多线程
和断点续传功能,默认是16K一个包,全部
源码
,已经在实际项目中应用。客户端有winform和服务两种方式的...
强大的TcpServer压力测试工具
源码
(附突破连接限制的方法和工具)
原版本升级,更稳定功能更强 一、 使用G-TcpClient模块 二、 可以设定间隔时间发起大规模长...四、 数据发送工作由一个独立线程担当,连接发起工作可设置多个独立的线程担当。 五、 可以多种模式组合连接或发送数据。
C++ 语言
64,647
社区成员
250,496
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章