Windows Winnet 实现HTTP 文件断点续传下载

转载自

http://hi.baidu.com/guorendong/blog/item/a033802f2392712f1f30899a.html

1. MFC 下载文件

有2种方法:
a)
创建CInternetSession 对象 -> 调用 CInternetSession::OpenURL 该函数解析URL,然后打开与URL指定的服务器连接,同时返回一个只读的CInternetFile对象 -> CInternetFile::Read 读取文件 -> 析构CInternetSession

b)
创建CInternetSession 对象 -> 调用 CInternetSession::GetHttpConnection
返 回CHttpConnection 对象 -> 调用CHttpConnection::OpenRequest 创建一个CHttpFile对象 -> CHttpFile::SendRequest 发送连接请求 -> CHttpFile::QueryInfo 获取HTTP 信息(比如文件大小, ETAG等) | CInternetFile::Read 读取文件 ->  析构CInternetSession

在上述过程中, 如果出现错误会抛出 CInternetException 异常
另外在打开链接前, 可以进行如下设置
CInternetSession::SetOption    读取或设置 InternetQuery 选项 (如超时或重试次数)
CInternetSession::EnableStatusCallback 设置回调函数监视session状态
CHttpFile::AddRequestHeaders   设置HTTP 请求头(需要在CHttpFile::SendRequest 前调用)


2. 实现断点续传
断点续传其实是通过在HTTP 请求头中设置要下载的文件区间来实现, 一个典型的HTTP 请求头是

  GEThttp://class/download.microtool.de:80/somedata.exe 
  Host:download.microtool.de
  Accept:*/*
  Pragma:no-cache
  Cache-Control:no-cache
  Referer:http://class/download.microtool.de/
  User-Agent:Mozilla/4.04[en](Win95;I;Nav)
  Range:bytes=554554-
 
注意最后一行:Range:bytes=554554-,格式为:Range: bytes=起始位置 - 终止位置,也就是说,我们可以通过设置Http请求头的设置起始结束位置,来获取HTTP文件的某一部分。


3. Win32 WinInet API 实现
和MFC 的函数对应, 执行下载操作大致需要的函数有:

InternetOpen是最先调用的函数,它返回HINTERNET句柄,习惯定义为hSession,即会话句柄, 相当于CInternetSession
InternetConnect使用hSession句柄,返回的是http连接句柄,定义为hConnect, 相当于 CInternetSession::GetHttpConnection
HttpOpenRequest使用hConnect句柄,返回的句柄是http请求句柄,定义为hRequest, 相当于 CHttpConnection::OpenRequest
HttpSendRequest(相 当于 CHttpFile::SendRequest)、HttpQueryInfo、InternetSetFilePointer和 InternetReadFile都使用HttpOpenRequest返回的句柄,即hRequest。

CInternetSession::OpenURL 相当于实现了 InternetConnect & HttpOpenRequest & HttpSendRequest 3个函数

当这几个句柄不再使用时,应该用函数InternetCloseHandle把它关闭,以释放其占用的资源。


用WinInet开发Internet客户端应用指南(一)  http://www.vckbase.com/document/viewdoc/?id=545
用WinInet开发Internet客户端应用指南(二) http://www.vckbase.com/document/viewdoc/?id=546
使用 CInternetSession 封装多线程 http 文件下载 http://www.vckbase.com/document/viewdoc/?id=1693
Http下载的断点续传       http://sunyan331.spaces.live.com/blog/cns!89B9F8BF2575E281!947.entry
HTTP服务器上断点下载文件(里面有很不错的源码)      http://www.cnitblog.com/wangk/archive/2007/05/22/5942.html
编写断点续传和多线程下载(有源码)   http://www.bbbh.org/20060427/2620/
WinInet: implementing resuming feature  http://www.clevercomponents.com/articles/article015/resuming.asp
(很详细的一个代码解释)Retrieving a file via. HTTP  http://www.codeproject.com/KB/IP/getwebfile.aspx
posted @ 2011-06-09 14:12  westfly  阅读(1651)  评论(0编辑  收藏  举报