91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

C++ WinHttp接收大數據流的方法

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

在C++中,使用WinHttp庫接收大數據流的方法如下:

  1. 首先,包含所需的頭文件并鏈接到WinHttp庫。
#include<iostream>
#include<vector>
#include<Windows.h>
#include <Winhttp.h>
#pragma comment(lib, "winhttp")
  1. 定義一個函數來初始化WinHttp會話、連接和請求。
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. 定義一個函數來接收大數據流。
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. 在主函數中調用ReceiveLargeDataStream函數。
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;
}

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

0
勐海县| 紫金县| 平定县| 黑河市| 沧源| 定襄县| 章丘市| 监利县| 都兰县| 马关县| 天等县| 上饶市| 望奎县| 宜宾市| 济宁市| 城口县| 青浦区| 宕昌县| 德保县| 屯留县| 江口县| 浙江省| 汶川县| 泊头市| 北海市| 新闻| 开原市| 扶风县| 桃园县| 漯河市| 营山县| 大埔县| 大方县| 镇远县| 沁阳市| 高邑县| 阜新| 绥阳县| 商水县| 德惠市| 府谷县|