使用wininet实现网络资源的下载

来源:互联网 发布:apache 进程池 编辑:程序博客网 时间:2024/06/01 10:37
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函数,关闭相关的网络连接。

代码展示如上:


原创粉丝点击