Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1684302
  • 博文数量: 347
  • 博客积分: 9328
  • 博客等级: 中将
  • 技术积分: 2680
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-29 23:45
文章分类

全部博文(347)

文章存档

2016年(1)

2013年(4)

2012年(207)

2011年(85)

2010年(50)

分类: C/C++

2010-11-18 21:39:12

BwWinINet.h

#pragma once
#pragma comment(lib, "Wininet.lib")
#pragma comment(lib, "strsafe.lib")

#include <Windows.h>
#include <WinInet.h>
#include <stdio.h>
#include <strsafe.h>

/*********************************
    WinINet 封装类
*********************************/


namespace BW_Network{

    class BwWinINet
    {
    public:
        BwWinINet(void);
        virtual ~BwWinINet(void);

        UINT OpenInternet();
        
        UINT ConnectInternet(LPCSTR host, UINT port);

        UINT OpenRequest(LPCSTR reqMethod, LPCSTR reqPath);

        BOOL SendRequest(LPCTSTR heads, DWORD headLen, LPVOID optional, DWORD optLen);

        UINT GetHeadAllLength();

        UINT GetHeadSingleLength(LPSTR pHead);

        BOOL QueryHeadAll(LPSTR dest, LPDWORD length);

        BOOL QueryHeadSingle(LPSTR dest, LPCSTR headname, size_t length);

        DWORD GetDataSize();

        BOOL AcquireData(LPVOID pData, DWORD size);

        BOOL SaveFile(LPCSTR path, LPSTR buf, UINT length );

        DWORD GetLastError();

    private:
        //Internet对象指针

        HINTERNET hInternet;
    };

}



BwWinINet.cpp:

#include "BwWinINet.h"

BW_Network::BwWinINet::BwWinINet(void)
{
    hInternet = NULL;
}

BW_Network::BwWinINet::~BwWinINet(void)
{

}

UINT BW_Network::BwWinINet::OpenInternet()
{
    hInternet = ::InternetOpenA(
        "",
        INTERNET_OPEN_TYPE_DIRECT,
        NULL,
        NULL,
        0);
    return ::GetLastError();
}

UINT BW_Network::BwWinINet::ConnectInternet( LPCSTR host, UINT port )
{
    hInternet = ::InternetConnect(
        hInternet,
        host,
        port,
        "",
        "",
        INTERNET_SERVICE_HTTP,
        0,
        0);
    return ::GetLastError();
}

UINT BW_Network::BwWinINet::OpenRequest( LPCSTR reqMethod, LPCSTR reqPath )
{
    hInternet = ::HttpOpenRequest(
        hInternet,
        reqMethod,
        reqPath,
        "HTTP/1.1",
        "",
        NULL,
        0,
        0);
    return ::GetLastError();
}

BOOL BW_Network::BwWinINet::SendRequest( LPCTSTR heads, DWORD headLen, LPVOID optional, DWORD optLen )
{
    BOOL rs = ::HttpSendRequest(
        hInternet,
        heads,
        headLen,
        optional,
        optLen);
    int err = ::GetLastError();
    return rs;
}

UINT BW_Network::BwWinINet::GetHeadAllLength()
{
    DWORD len = 0;
    BOOL rs = ::HttpQueryInfo(
        hInternet,
        HTTP_QUERY_RAW_HEADERS_CRLF ,
        NULL,
        &len,
        NULL);
    return !rs && ERROR_INSUFFICIENT_BUFFER == GetLastError() ? len : -1;
}

UINT BW_Network::BwWinINet::GetHeadSingleLength( LPSTR pHead)
{
    DWORD len = 0;
    BOOL rs = ::HttpQueryInfo(
        hInternet,
        HTTP_QUERY_CUSTOM ,
        pHead,
        &len,
        NULL);
    return !rs && ERROR_INSUFFICIENT_BUFFER == GetLastError() ? len : -1;
}

BOOL BW_Network::BwWinINet::QueryHeadAll( LPSTR dest, LPDWORD length )
{
    return ::HttpQueryInfo(
        hInternet,
        HTTP_QUERY_RAW_HEADERS_CRLF ,
        dest,
        length,
        NULL);
}

BOOL BW_Network::BwWinINet::QueryHeadSingle( LPSTR dest, LPCSTR headname, size_t length )
{
    StringCchPrintf((LPSTR)dest, length, headname);
    return ::HttpQueryInfo(
        hInternet,
        HTTP_QUERY_CUSTOM ,
        dest,
        (LPDWORD)&length,
        NULL);
}

DWORD BW_Network::BwWinINet::GetDataSize()
{
    DWORD byteNums;
    ::InternetQueryDataAvailable(
        hInternet,
        &byteNums,
        0,
        0);
    return byteNums;
}

BOOL BW_Network::BwWinINet::AcquireData(LPVOID pData, DWORD size)
{
    DWORD toRead = 0;
    return ::InternetReadFile(
        hInternet,
        pData,
        size,
        &toRead);
}

BOOL BW_Network::BwWinINet::SaveFile( LPCSTR path, LPSTR buf, UINT length )
{
    FILE *pf = NULL;
    errno_t err = ::fopen_s(&pf, path,"wb");
    int wLen = fwrite(buf, sizeof(char), length, pf);
    ::fclose(pf);
    return wLen == length;
}

DWORD BW_Network::BwWinINet::GetLastError()
{
    return ::GetLastError();
}


测试:

#pragma once

#include "BwWinINet.h"

using namespace BW_Network;

int main(int argc, char* argv[])
{
    BwWinINet internet;
    internet.OpenInternet();
    
    int error;
    error = internet.ConnectInternet("127.0.0.1", 1032);

    error = internet.OpenRequest("GET", "/Data/test.rar");    ///Data/test.rar


    error = internet.SendRequest(NULL, 0, NULL, 0);

    //Query all heads
    DWORD headsLen = internet.GetHeadAllLength();
    LPSTR pHeads = new CHAR[headsLen];
    internet.QueryHeadAll(pHeads, &headsLen);
    printf("Head List:%s\n", pHeads);
    
    //Query specific head
    DWORD hLen = internet.GetHeadSingleLength("Content-Type");
    LPSTR ph = new CHAR[hLen];
    internet.QueryHeadSingle(ph, "Content-Type", hLen);
    printf("Content-Type:%s\n", ph);

    //Download file
    DWORD size = internet.GetDataSize();
    LPVOID pData = new CHAR[size];
    error = internet.AcquireData(pData, size);
    error = internet.SaveFile("T:/test.rar", (LPSTR)pData, size );

    return 0;
}


阅读(4697) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~