原文:http://hi.baidu.com/kun%5Fg/blog/item/42bbcc9500af260e7af480fc.html
本文是这篇文章的应用,实现的功能是访问本篇文章
代码如下:
#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")
void main()
{
HINTERNET hSession, hConnection, hRequest;
TCHAR hostname[] = "hi.baidu.com"; //要访问的主机
TCHAR username[] = ""; //用户名
TCHAR password[] = ""; //密码
TCHAR verb[] = "GET"; //动作
TCHAR objectname[] = "/kun_g/blog/item/42bbcc9500af260e7af480fc.html"; //要访问的资源,访问默认页面时可使用空串
TCHAR version[] = "HTTP/1.1"; //协议版本
LPCTSTR lpreferer = NULL; //参考
LPCTSTR accepttypes = "text/*";
TCHAR headers[] = "/r/n/r/n"; //头
TCHAR addtionheaders[] = ""; //附加头
LPVOID lpvBuffer = NULL; //用于存储返回数据的内存
LPVOID lpvBuffTemp = NULL; //临时缓冲区
LPVOID lpvBuff = NULL;
DWORD dwBufferLength = 1024; //lpvBuffer的内存大小
DWORD dwReaded = 0; //读取了多少字节的数据
DWORD nCount = 0; //读取了多少次数据
//建立会话
hSession =InternetOpen("Testing",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if (NULL == hSession)
{
MessageBox(NULL, "InternetOpen failed!", "Error!", MB_OK);
return ;
}
//建立连接
hConnection = InternetConnect( hSession, hostname, INTERNET_DEFAULT_HTTP_PORT, username, password, INTERNET_SERVICE_HTTP, 0, 0 );
if (NULL == hConnection)
{
MessageBox(NULL, "InternetConnect failed!", "Error!", MB_OK);
return ;
}
//建立请求
hRequest = HttpOpenRequest(hConnection, verb, objectname, version, lpreferer, &accepttypes, 0, 0);
if (NULL == hRequest)
{
MessageBox(NULL, "HttpOpenRequest failed!", "Error!", MB_OK);
return ;
}
//添加请求
if (!HttpAddRequestHeaders(hRequest, headers, -1, HTTP_ADDREQ_FLAG_ADD | HTTP_ADDREQ_FLAG_REPLACE))
{
MessageBox(NULL, "HttpAddRequestHeaders failed!", "Error!", MB_OK);
return ;
}
//发送请求
if (!HttpSendRequest(hRequest, addtionheaders, -1, NULL, 0))
{
MessageBox(NULL, "HttpSendRequest failed!", "Error!", MB_OK);
return ;
}
//查询返回的信息
lpvBuffer = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof (BYTE)*dwBufferLength);
while (!HttpQueryInfo(hRequest, HTTP_QUERY_RAW_HEADERS_CRLF, lpvBuffer, &dwBufferLength, NULL))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{//内存不够大,重新分配
GlobalFree(lpvBuffer);lpvBuffer = NULL;
lpvBuffer = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof (BYTE)*dwBufferLength);
}
else
{
MessageBox(NULL, "HttpQueryInfo failed!", "Error!", MB_OK);
return ;
}
}
*((BYTE *)lpvBuffer+dwBufferLength) = '/0';
MessageBox(NULL, lpvBuffer, "QueryInfo", MB_OK);
GlobalFree(lpvBuffer);lpvBuffer = NULL;
//读取HTML文件
dwBufferLength = 1024;
lpvBuffer = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, dwBufferLength + 1);//给'/0'留个位子
do
{//循环读取,直到读完
InternetReadFile(hRequest, lpvBuffer, dwBufferLength, &dwReaded);
*((BYTE *)lpvBuffer+dwReaded) = '/0';
nCount++;
//分配内存
lpvBuffTemp = lpvBuff;
lpvBuff = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, sizeof (BYTE)*(dwBufferLength*nCount + 1));
if (NULL != lpvBuffTemp)
{
memcpy(lpvBuff, lpvBuffTemp, dwBufferLength*(nCount-1) + 1);
}
strcat(lpvBuff, lpvBuffer);
} while (0 != dwReaded);
GlobalFree(lpvBuffTemp); lpvBuffTemp = NULL;
GlobalFree(lpvBuffer); lpvBuffer = NULL;
lpvBuffer = lpvBuff; lpvBuff = NULL;
printf("%s", lpvBuffer);
GlobalFree(lpvBuffer); lpvBuffer = NULL;
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnection);
InternetCloseHandle(hSession);
}
PS.想看执行效果可以在CMD中 用重定位符“>>”输出到一个html文件中,然后用浏览器打开这个文件就能看到效果了。
Like this:
图中弹出的对话框是服务器返回的HTTP头
本文介绍了一个使用Windows下的WinInet API实现网页访问的例子。通过C++代码演示了如何创建Internet会话、建立连接、发送请求并读取响应数据。


436

被折叠的 条评论
为什么被折叠?



