window winhttp

#include <iostream>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <windows.h>
#include <winhttp.h>
#include <regex>
#pragma comment(lib, "winhttp.lib")

using namespace std;

int main(int argc, char* argv[])
{
    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    LPSTR pszOutBuffer;
    BOOL bResults = FALSE;
    HINTERNET hSession = NULL,
        hConnect = NULL,
        hRequest = NULL;

    //1. 初始化一个WinHTTP-session句柄,参数1为此句柄的名称
    hSession = WinHttpOpen(L"GetIP",
        WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
        WINHTTP_NO_PROXY_NAME,
        WINHTTP_NO_PROXY_BYPASS, 0);

    //  通过上述句柄连接到服务器 需要指定服务器的IP和端口号,如果连接成功 返回的hConnect句柄不为NULL
    if (hSession)
        hConnect = WinHttpConnect(hSession, L"myip.ipip.net",
            INTERNET_DEFAULT_HTTP_PORT, 0); //默认是80

    // 通过hConnect句柄创建一个hRequest句柄,用于发送数据与读取从服务器返回的数据。
    // 参数2表示请求方式 这边我是用get    如果是post 要给出具体的地址 
    if (hConnect)
        hRequest = WinHttpOpenRequest(hConnect, L"GET",
            L"",
            NULL, WINHTTP_NO_REFERER,
            WINHTTP_DEFAULT_ACCEPT_TYPES,
            0);

    // 向服务器发送post数据
    if (hRequest)
        bResults = WinHttpSendRequest(hRequest,
            WINHTTP_NO_ADDITIONAL_HEADERS,
            0, WINHTTP_NO_REQUEST_DATA, 0,
            0, 0);

    // End the request.
    if (bResults)
        bResults = WinHttpReceiveResponse(hRequest, NULL);

    // Continue to verify data until there is nothing left.
    if (bResults)
    {
        do
        {
            // Verify available data.
            dwSize = 0;
            if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
                printf("Error %u in WinHttpQueryDataAvailable.
",
                    GetLastError());
            
            if (dwSize == 0)
                break;
            // Allocate space for the buffer.
            pszOutBuffer = new char[dwSize + 1];

            // Read the Data.
            ZeroMemory(pszOutBuffer, dwSize + 1);

            if (!WinHttpReadData(hRequest, (LPVOID)pszOutBuffer,
                dwSize, &dwDownloaded))
                printf("Error %u in WinHttpReadData.
", GetLastError());
            else
            {
                printf("%s
", pszOutBuffer);
                char* pszBuffer = new char[dwSize + 1];
                wchar_t* pszWideBuffer = new wchar_t[(dwSize + 1) * 2];
                memset(pszWideBuffer, 0, (dwSize + 1) * 2);
                memset(pszBuffer, 0, dwSize + 1);
                MultiByteToWideChar(CP_UTF8, 0, pszOutBuffer, dwSize, pszWideBuffer,
                    (dwSize + 1) * 2);  //将unicode编码,转换为宽字节
                WideCharToMultiByte(CP_ACP, 0, pszWideBuffer, wcslen(pszWideBuffer),
                    pszBuffer, dwSize + 1, NULL,
                    NULL);  //将宽字节,转换为控制台编码
                printf("%s
", pszBuffer);
                string info(pszBuffer);
                delete[] pszBuffer;
                delete[] pszWideBuffer;
                std::smatch result;
                std::regex pattern(
                    "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"); //正则表达式 
                std::string::const_iterator iterStart = info.begin();
                std::string::const_iterator iterEnd = info.end();
                std::string temp = "";
                if (regex_search(iterStart, iterEnd, result, pattern)) {
                    temp = result[0];
                }
                printf("%s", temp.c_str());
            }
            // Free the memory allocated to the buffer.
            delete[] pszOutBuffer;
        } while (dwSize > 0);
    }
    // Report errors.
    if (!bResults)
        printf("Error %d has occurred.
", GetLastError());

    // Close open handles.
    if (hRequest) WinHttpCloseHandle(hRequest);
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);

}
原文地址:https://www.cnblogs.com/Galesaur-wcy/p/15023559.html