• 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);
    
    }
  • 相关阅读:
    FastMM、FastCode、FastMove的使用(图文并茂)
    12种JavaScript MVC框架之比较
    十款最佳Node.js MVC框架
    Couchbase 服务器
    C#程序员阅读的书籍
    ORM的实现
    Linux内核策略介绍
    ASP.NET MVC + EF 利用存储过程读取大数据
    面向.Net程序员的dump分析
    动态加载与插件化
  • 原文地址:https://www.cnblogs.com/Galesaur-wcy/p/15023559.html
Copyright © 2020-2023  润新知