您的位置:首页 > 理论基础 > 计算机网络

使用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函数,关闭相关的网络连接。

代码展示如上:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: