【转】Windows Internet - 用WinINet函数实现访问BLOG

本文介绍了一个使用Windows下的WinInet API实现网页访问的例子。通过C++代码演示了如何创建Internet会话、建立连接、发送请求并读取响应数据。

原文: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头


这是用浏览器打开输出的文件的效果
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值