C++ WinHttp接收大数据流的方法

avatar
作者
筋斗云
阅读量:0

在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>中。你可以根据需要修改此代码以处理接收到的数据。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!