当前位置:  -> 首页 -> C++下通过WININET来进行文件下载

上一篇 | 下一篇
C++下通过WININET来进行文件下载
作者:洛羽叶  点击率:2428  发布时间:2012-11-22
Windows Internet Application Programming Interface(WinINet)是Windows操作系统支持的提供给C++语言的互联网协议编程接口,支持HTTP1.0,HTTP1.1,FTP,如果要实现文件下载需要用到该编程接口,当然你也可以采用SOCKET直接根据FTP及HTTP协议开发,如果你要实现SERVER端的功能需要采用WINHTTP来实现。

对于文件下载WININET有两种用法,第一种通过InternetOpen、InternetConnect、HttpOpenRequest、InternetReadFile、InternetSetFilePointer来实现,有更多的灵活性。
第二种也是我们要采用的InternetOpen、InternetOpenUrl、InternetReadFile、InternetSetFilePointer。

首先打开连接:
HINTERNET hSession=::InternetOpenA(
"IE/1.0", INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0); 

打开文件:
HINTERNET hUrl=::InternetOpenUrlA(hSession, File,
NULL,0,INTERNET_FLAG_DONT_CACHE,0);

查询文件大小:

long long size=0;
DWORD dwSizeOfRq=
8;
::HttpQueryInfo(hUrl,HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&size, &dwSizeOfRq, 
NULL);
注意,如果要获取4GB以上的文件大小要采用如下的方式,以上最多能支持到大约3.6GB。
HTTP_QUERY_FLAG_NUMBER表示获取的返回值是32位的数值。


char buf[16]={0};
long long size=0;
DWORD dwSizeOfRq=
16;
BOOL bResult=::HttpQueryInfo(hUrl,HTTP_QUERY_CONTENT_LENGTH, buf, &dwSizeOfRq, 
NULL);
if(bResult)
 size=_atoi64(buf);

else
 size=-1;


释放资源
::InternetCloseHandle(hSession);
::InternetCloseHandle(hUrl);

对于断点续传需要注意的是不要采用InternetSetFilePointer方法,效率极低,

采用附加头的方式提交请求 hUrl=::InternetOpenUrlA(hSession,file,
"Range:bytes=1-100",-1,INTERNET_FLAG_DONT_CACHE,0);
标签: WININET INTERNETOPENURL C++
引用地址:本站原创
   站点首页      技术人生      旅途足迹      我要留言      友情链接      关于站长   
[本站统计]
在线人数:21
今日访问:99
总访问量:1936592
Copyright 2006-2022 EasyWeb 1.6 订阅 All Rights Reserved
粤ICP备08028977号-1
www.luoriver.com
Created by WWH in 2006