网络蚂蚁与FlashGet的文件多线程下载原理
2006-04-24 15:15
197 查看
最近自己写了一个类似网络蚂蚁和FlashGet一样的程序,主要是为了自己能学点东西,不过还好,已经有点样子了,已经实现了类似它们的界面风格和功能,只是里面的下载任务、错误任务、已完成任务、中止任务的调度问题还没有详细去做,通过IE右键菜单的传参数还没有解决,IE右键菜单已经现,已经能够取到鼠标位置的URL,只是不知如何将取得的一个URL传给下载程序,还有待解决。现在将多线程下载同一个文件的原理讲述一下:
1、首先得到要下载的文件的长度,这是通过Http的HEAD命令得到其长度。
2、根据长度和线程数,确定各线程所下载的数据范围。通过HTTP的Get命令,这里需要指定From和To.
3、创建一个文件,这个文件是一个空文件,不需要事先生成与下载文件同样大小的空文件。给每个线程只需要传递其打开的文件句柄即可。
4、创建各个下载线程,每个线程接受到数据后就保存到相应的位置上去。这里不需要对文件加锁,因为操作系统一级本身对文件的I/O有锁的,我们的应用不用管,而且各个线程所写的文件位置是不一样的,每一线程负责下载和写一段数据。每个线程都记录下来了当前已经下载到的位置,这样若有线程出错了,可以从断点处继续下载。
5、等各线程都下载完各自的数据块后,最后中关闭这个文件。
注意:这里的文件打开时一定要以二制打开,否则在调用fseek时将导致位置定位不正确。
FILE *f;
if(( f = fopen(szFileName, "wr") != NULL)
{
...............................;
fclose(f);
}
1、首先得到要下载的文件的长度,这是通过Http的HEAD命令得到其长度。
2、根据长度和线程数,确定各线程所下载的数据范围。通过HTTP的Get命令,这里需要指定From和To.
3、创建一个文件,这个文件是一个空文件,不需要事先生成与下载文件同样大小的空文件。给每个线程只需要传递其打开的文件句柄即可。
4、创建各个下载线程,每个线程接受到数据后就保存到相应的位置上去。这里不需要对文件加锁,因为操作系统一级本身对文件的I/O有锁的,我们的应用不用管,而且各个线程所写的文件位置是不一样的,每一线程负责下载和写一段数据。每个线程都记录下来了当前已经下载到的位置,这样若有线程出错了,可以从断点处继续下载。
5、等各线程都下载完各自的数据块后,最后中关闭这个文件。
注意:这里的文件打开时一定要以二制打开,否则在调用fseek时将导致位置定位不正确。
FILE *f;
if(( f = fopen(szFileName, "wr") != NULL)
{
...............................;
fclose(f);
}
相关文章推荐
- PLSQL连接ORACLE配置字符串简介 oracle网络配置 三个配置文件 listener.ora、sqlnet.ora、tnsnames.ora原理解释
- linux--嵌入式网络文件系统(NFS)搭建原理
- Android--第四天(网络图片查看器,多线程下载,文件断点上传原理,Intent,Activity生命周期,广播,服务)
- caffe源码学习——用python定义网络时,源代码生成prototxt文件的原理
- java SE 文件多线程下载,断点续传 原理
- 网络下载编程的单文件多线程下载和断电续传
- Delphi实现网络蚂蚁和FlashGet的悬浮窗口,拖动
- Delphi实现网络蚂蚁和FlashGet的悬浮窗口,拖动
- 14:property配置文件及网络编程原理
- Android:网络:多线程下载(原理)
- Java SE 多线程下载网络上的文件代码+注释
- Android第九讲——网络(四) 文件的下载(单线程下载、多线程下载)
- 网络蚂蚁的最基本原理 - http 1.1
- 优雅设计封装基于Okhttp3的网络框架(二):多线程下载功能原理设计 及 简单实现
- NFS网络文件系统原理及案例
- 网络配置文件
- 操作系统原理与实践10--proc文件系统实现
- 日志工具类-文件操作工具类-网络工具类-单位转换-屏幕获取工具类
- 挂载nfs网络文件系统小结