使用wininet实现网络资源的下载
2017-11-05 22:49
375 查看
BOOL CHttpOperation::httpDownLoadFile() { wchar_t wuserAgent[BUF_SIZE] = { 0 }; CharToWchar(m_userAgent.c_str(), wuserAgent); m_hOpenNet = InternetOpen(wuserAgent, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (m_hOpenNet == NULL) { return FALSE; } wcscpy(wuserAgent, _T("http://192.168.1.80:8012/test.txt")); m_hOpenUrlNet = InternetOpenUrl(m_hOpenNet, wuserAgent, NULL, 0, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_PRAGMA_NOCACHE, 0); if (m_hOpenUrlNet == NULL) { return FALSE; } //检查状态码 DWORD dwStatusCode; DWORD dwStatusSize = sizeof(dwStatusCode); HttpQueryInfo(m_hOpenUrlNet, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwStatusCode, &dwStatusSize, NULL); if (dwStatusCode != 200) { InternetCloseHandle(m_hOpenUrlNet); InternetCloseHandle(m_hOpenNet); return FALSE; } //获取接收数据大小 DWORD m_iSize; DWORD dwLengthSize = sizeof(m_iSize); HttpQueryInfo(m_hOpenUrlNet, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &m_iSize, &dwLengthSize, NULL); if (m_iSize < 0) { InternetCloseHandle(m_hOpenUrlNet); InternetCloseHandle(m_hOpenNet); return FALSE; } //创建本地的文件 memset(wuserAgent,0,BUF_SIZE); wcscpy(wuserAgent, _T("d:\\test.txt")); HANDLE createFile = CreateFile(wuserAgent, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (createFile == NULL || createFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(m_hOpenUrlNet); InternetCloseHandle(m_hOpenNet); return FALSE; } //读取文件 char buffer[BUF_SIZE] = {0}; DWORD byteRead = 0; BOOL hwrite; DWORD written; int a = 0; if (m_hOpenUrlNet != NULL) { while (true) { InternetReadFile(m_hOpenUrlNet, buffer, sizeof(buffer), &byteRead); if (byteRead == 0)//读取完毕 break; hwrite = WriteFile(createFile, buffer, byteRead, &written, NULL); if (hwrite == 0)//写入失败 break; } } //下载完毕关闭连接 InternetCloseHandle(m_hOpenUrlNet); InternetCloseHandle(m_hOpenNet); return TRUE; }
wininet是Windows Internet的一套网络编程接口,这个接口中包含了Internet处理的3个协议:HTTP、FTP、gopher(这个协议已经很少使用了)。这套接口,减少了我们的工作量,只要简单的了解HTTP和FTP的协议,就可以轻松的编写代码,实现相关的功能;并不需要我们使用socket(其实是wininet帮助我们完成了socket的相关操作)。这里我们主要讲解怎样通过HTTP协议实现网络资源的下载:
可以有两种方式实现:1、直接调用Windows的API函数:urldownloadtofile,将指定的某个网络URL中的资源,下载到本地
调用这个函数时,需要注意:档URL中存在中文时,需要首先将gb2312转码之后,可以使用
2、调用wininet动态库中的函数,实现文件的下载。操作的流程如下:
1)、使用Internetopen函数,完成wininet.dll的初始化工作;
2)、使用InternetopenUR函数,访问给定的URL中,指定的某个资源;
3)、使用InternetQueryInfo函数,检测访问的状态,以及得到该文件的长度;
4)、使用CreateFile函数。创建一个本地文件,存放下载的网络文件;
5)、使用Internetreadfile函数,下载网络资源;并通过writefile函数将下载的资源写入本地文件;
6)、使用InternetCloseHandle函数,关闭相关的网络连接。
代码展示如上:
相关文章推荐
- 转载 通过JAVA语言实现使用URL访问网络资源
- [Android]网络资源下载时断点续传的实现
- 如何使用HttpClient下载网络资源(包括下载ssl认证的资源)
- Java使用Http实现网络图片的下载
- Android 下载显示网络图片 实现直接使用类似setimage的方法来完成
- 使用jswing自制简单浏览器 实现浏览网络及本地资源 有前进,后退,刷新,文件新建等功能
- 使用HttpClient进行资源下载和压缩,提供终端版本和web版本实现
- 使用ListView和AsyncTask、fastjson解析Json以及适配器BaseAdapter来实现下载网络的图片以及文字并显示出来
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄
- 使用Python编写简单网络爬虫抓取视频下载资源
- iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄
- 使用 java 开源资源实现通用可靠的下载组件
- 使用Service实现网络音乐下载并播放
- 使用Python编写简单网络爬虫抓取视频下载资源
- 【转】使用多域名实现资源并行下载
- iOS开发之网络编程--使用NSURLConnection实现大文件下载
- [Android]网络资源下载时断点续传的实现
- Android 网络:使用URL访问网络资源,ImageView,下载到本地
- [Android]网络资源下载时断点续传的实现
- [Android]网络资源下载时断点续传的实现