C++ WinHttp接收大數(shù)據(jù)流的方法

c++
小樊
84
2024-08-29 16:56:42
欄目: 編程語言

在C++中,使用WinHttp庫(kù)接收大數(shù)據(jù)流的方法如下:

  1. 首先,包含所需的頭文件并鏈接到WinHttp庫(kù)。
#include<iostream>
#include<vector>
#include<Windows.h>
#include <Winhttp.h>
#pragma comment(lib, "winhttp")
  1. 定義一個(gè)函數(shù)來初始化WinHttp會(huì)話、連接和請(qǐng)求。
HINTERNET InitializeWinHttp(const std::wstring& url) {
    HINTERNET hSession = WinHttpOpen(L"MyUserAgent", WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);
    if (!hSession) {
        return NULL;
    }

    URL_COMPONENTS urlComponents;
    ZeroMemory(&urlComponents, sizeof(urlComponents));
    urlComponents.dwStructSize = sizeof(urlComponents);
    urlComponents.dwSchemeLength = -1;
    urlComponents.dwHostNameLength = -1;
    urlComponents.dwUrlPathLength = -1;

    if (!WinHttpCrackUrl(url.c_str(), static_cast<DWORD>(url.length()), 0, &urlComponents)) {
        WinHttpCloseHandle(hSession);
        return NULL;
    }

    HINTERNET hConnect = WinHttpConnect(hSession, urlComponents.lpszHostName, urlComponents.nPort, 0);
    if (!hConnect) {
        WinHttpCloseHandle(hSession);
        return NULL;
    }

    HINTERNET hRequest = WinHttpOpenRequest(hConnect, L"GET", urlComponents.lpszUrlPath, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0);
    if (!hRequest) {
        WinHttpCloseHandle(hSession);
        WinHttpCloseHandle(hConnect);
        return NULL;
    }

    return hRequest;
}
  1. 定義一個(gè)函數(shù)來接收大數(shù)據(jù)流。
bool ReceiveLargeDataStream(const std::wstring& url, std::vector<char>& data) {
    HINTERNET hRequest = InitializeWinHttp(url);
    if (!hRequest) {
        return false;
    }

    if (!WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0)) {
        WinHttpCloseHandle(hRequest);
        return false;
    }

    if (!WinHttpReceiveResponse(hRequest, NULL)) {
        WinHttpCloseHandle(hRequest);
        return false;
    }

    DWORD dwStatusCode = 0;
    DWORD dwSize = sizeof(dwStatusCode);
    if (!WinHttpQueryHeaders(hRequest, WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, NULL, &dwStatusCode, &dwSize, NULL)) {
        WinHttpCloseHandle(hRequest);
        return false;
    }

    if (dwStatusCode != HTTP_STATUS_OK) {
        WinHttpCloseHandle(hRequest);
        return false;
    }

    char buffer[4096];
    DWORD dwBytesRead;
    do {
        if (!WinHttpReadData(hRequest, buffer, sizeof(buffer), &dwBytesRead)) {
            WinHttpCloseHandle(hRequest);
            return false;
        }

        if (dwBytesRead == 0) {
            break;
        }

        data.insert(data.end(), buffer, buffer + dwBytesRead);
    } while (true);

    WinHttpCloseHandle(hRequest);
    return true;
}
  1. 在主函數(shù)中調(diào)用ReceiveLargeDataStream函數(shù)。
int main() {
    std::wstring url = L"https://example.com/large-data-stream";
    std::vector<char> data;

    if (ReceiveLargeDataStream(url, data)) {
        std::cout << "Received data size: "<< data.size()<< std::endl;
    } else {
        std::cerr << "Failed to receive data stream."<< std::endl;
    }

    return 0;
}

這個(gè)示例將從指定的URL接收大數(shù)據(jù)流,并將其存儲(chǔ)在std::vector<char>中。你可以根據(jù)需要修改此代碼以處理接收到的數(shù)據(jù)。

0