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