当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

编写断点续传和多线程下载模块[VC/C++编程]

赞助商链接



  本文“编写断点续传和多线程下载模块[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

本文配套源码

概述

在当今的网络时代,下载软件是利用最为频繁的软件之一.几年来,下载技术也在不断地发展.最原始的下载功效仅仅是个“下载”历程,即从WEB服务器上持续地读取文件.其最大的问题是,由于网络的不安定性,一旦衔接断开使得下载历程中止,就不得不全部重新再来一次.

随后,“断点续传”的概念就出来了,顾名思义,就是假以下载中止,在重新成立衔接后,跳过已经下载的部份,而只下载还没有下载的部份.

无论“多线程下载”技术能否洪以容先生的创造,洪以容使得这项技术得到前所未有的关注是不争的事实.在“网络蚂蚁”软件风行开后,很多下载软件也都纷纷效仿,能否具?quot;多线程下载"技术、乃至能支持多少个下载线程都成了人们评测下载软件的要素."多线程下载"的底子是WEB服务器支持远程的随机读取,也即支持"断点续传".这样,在下载时可以把文件分成若干部份,每一部份成立一个下载线程举行下载.

目前,不要说编写专门的下载软件,在自己编写的软件中,加入下载功效有时也非常必要.如让自己的软件支持自动在线进级,大概在软件中自动下载新的数据举行数据更新,这都是很有效、并且很实用的功效.本文的主题即怎样编写一个支持"断点续传"和"多线程"的下载模块.当然,下载的历程非常复杂,在一篇文章中难以全部阐明,所以,与下载历程关系不直接的部份基本上都忽视了,如非常处理和网络错误处理等,敬请各位读者注意.我利用的开辟环境是C++ Builder 5.0,利用其他开辟环境大概编程语言的朋友请自行作得当改正.

HTTP协议简介

下载文件是电脑与WEB服务器交互的历程,它们交互的"语言"的专业名称是协议.传送文件的协议有多种,最常用的是HTTP(超文本传输协议)和FTP(文件传送协议),我采取的是HTTP.

HTTP协议最基本的号令只有三条:Get、Post和Head.Get从WEB服务器恳求一个特定的对象,比方HTML页面大概一个文件,WEB服务器通过一个Socket衔接发送此对象作为呼应;Head号令使服务器给出此对象的基本描写,比方对象的范例、大小和更新时间.Post号令用于向WEB服务器发送数据,普通使把信息发送给一个单独的利用程序,经处理生成动态的后果返回给浏览器.下载便是通过Get号令实现.

基本的下载历程

编写下载程序,可以直接利用Socket函数,但是这要求开辟人员理解、熟习TCP/IP协议.为了简化Internet客户端软件的开辟,Windows供应了一套WinInet API,对常用的网络协议举行了封装,把开辟Internet软件的门坎大大降低了.我们需求利用的WinInet API函数如图1所示,调用次序基本上是从上到下,其具体的函数原型请参考MSDN.

图1

在利用这些函数时,必须严峻辨别它们利用的句柄.这些句柄的范例是一样的,都是HINTERNET,但是作用差别,这一点非常让人迷惑.按照这些句柄的产生次序和调用关系,可以分为三个级别,下一级的句柄由上一级的句柄得到.

InternetOpen是最早调用的函数,它返回的HINTERNET句柄级别最高,我习惯定义为hSession,即会话句柄.

InternetConnect利用hSession句柄,返回的是http衔接句柄,我把它定义为hConnect.

HttpOpenRequest利用hConnect句柄,返回的句柄是http恳求句柄,定义为hRequest.

HttpSendRequest、HttpQueryInfo、InternetSetFilePointer和InternetReadFile都利用HttpOpenRequest返回的句柄,即hRequest.

当这几个句柄不再利用是,应当用函数InternetCloseHandle把它关闭,以释放其占用的资源.

首先成立一个名为THttpGetThread、成立后自动挂起的线程模块,我但愿线程在完成后自动销毁,所以在构造函数中设置:

FreeOnTerminate = True; // 自动删除

并增添以下成员变量:

char Buffer[HTTPGET_BUFFER_MAX+4]; // 数据缓冲区
AnsiString FURL; // 下载对象的URL
AnsiString FOutFileName; // 保存的途径和名称
HINTERNET FhSession; // 会话句柄
HINTERNET FhConnect; // http衔接句柄
HINTERNET FhRequest; // http恳求句柄
bool FSuccess; // 下载能否成功
int iFileHandle; // 输出文件的句柄


  以上是“编写断点续传和多线程下载模块[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 编写断点续传和多线程下载模块
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .