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);
|