gpt4 book ai didi

c - WinHTTP 多个异步请求

转载 作者:太空宇宙 更新时间:2023-11-03 23:33:07 25 4
gpt4 key购买 nike

我需要从网站的大约 6000 页中提取数据。在做了一些研究之后,我决定试一试 WinHTTP。我能够让它工作,但是我正在同步做事,所以需要一段时间才能完成。我现在正尝试异步使用 WinHTTP,但遇到了障碍。我四处搜索了一些教程和示例,但我只能找到 MSDN 文档,这对于我正在做的事情来说似乎过于复杂。如前所述,我找不到很多资源,所以我继续尝试了一下:

std::string theSource = "";
char * httpBuffer;
DWORD dwSize = 1;
DWORD dwRecv = 1;

HINTERNET hOpen =
WinHttpOpen
(
L"Example Agent",
WINHTTP_ACCESS_TYPE_NO_PROXY,
NULL,
NULL,
WINHTTP_FLAG_ASYNC
);

WINHTTP_STATUS_CALLBACK theCallback =
WinHttpSetStatusCallback
(
hOpen,
(WINHTTP_STATUS_CALLBACK) HttpCallback,
WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS,
NULL
);

HINTERNET hConnect =
WinHttpConnect
(
hOpen,
L"example.org",
INTERNET_DEFAULT_HTTPS_PORT,
0
);

HINTERNET hRequest = NULL;

BOOL allComplete = false;

int theRequest = 1;


while (!allComplete)
{
if (theRequest == 1)
{
hRequest = WinHttpOpenRequest
(
hConnect,
L"GET",
L"example.html",
0,
WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
WINHTTP_FLAG_SECURE
);


WinHttpSendRequest
(
hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0,
WINHTTP_NO_REQUEST_DATA,
0,
0,
0
);
}

else if (theRequest == 2)
{
WinHttpReceiveResponse(hRequest, NULL);
}

else if (theRequest == 3)
{
WinHttpQueryHeaders
(
hRequest,
WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX,
NULL,
&dwSize,
WINHTTP_NO_HEADER_INDEX
);

WCHAR * headerBuffer = new WCHAR[dwSize/sizeof(WCHAR)];

WinHttpQueryHeaders
(
hRequest,
WINHTTP_QUERY_RAW_HEADERS_CRLF,
WINHTTP_HEADER_NAME_BY_INDEX,
headerBuffer,
&dwSize,
WINHTTP_NO_HEADER_INDEX
);

delete [] headerBuffer;

dwSize = 1;

while (dwSize > 0)
{
if (!WinHttpQueryDataAvailable(hRequest, &dwSize))
{
break;
}

httpBuffer = new char[dwSize + 1];

ZeroMemory(httpBuffer, dwSize + 1);

if (!WinHttpReadData(hRequest, httpBuffer, dwSize, &dwRecv))
{
std::cout << "WinHttpReadData() - Error Code: " << GetLastError() << "\n";
}

else
{
theSource = theSource + httpBuffer;
}

delete [] httpBuffer;

// Parse the source for the data I'm looking for.

break;

}
}

下面是我的回调函数:

void CALLBACK HttpCallback(HINTERNET hInternet, DWORD * dwContext, DWORD dwInternetStatus, void * lpvStatusInfo, DWORD dwStatusInfoLength)
{
switch (dwInternetStatus)
{
default:
std::cout << dwInternetStatus << "\n";
break;

case WINHTTP_CALLBACK_STATUS_HANDLE_CREATED:
std::cout << "Handle created.\n";
theRequest = 1;
break;

case WINHTTP_CALLBACK_STATUS_REQUEST_SENT:
std::cout << "Request sent.\n";
theRequest = 2;
break;

case WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED:
std::cout << "Response received.\n";
theRequest = 3;
break;

}
}

注意:我只提供了我的代码的这一部分,因为它是与我的问题/问题相关的部分。如果缺少变量声明,我深表歉意。

上面的代码对我有用,实际上确实获得了我正在寻找的所需信息,但仅适用于单个页面。到了这一步后,我意识到当使用这种方法发出多个请求时,我不知道该怎么做。同样,除了 MSDN 文章外,搜索结果并不多,据我所知,这些文章并不是一次发出多个请求的示例。此外,我用来打开/发送/等的 while 循环。基于 theRequest 值的请求似乎是一种糟糕的方法。我也很感激任何其他建议来改进我的代码。

总的来说,这里是我的问题的总结:我需要使用 WinHTTP 异步发出大约 6000 个 GET 请求。我不完全确定如何执行此操作,因为我是 WinHTTP 的新手,所以我正在寻找最基本(或可能有效)的方式来处理多个异步请求。

最佳答案

你将在 while (!allComplete) { ... } 中重复你正在做的事情,并以这种方式发送更多请求。您可以重用 hConnect,但您需要为每个资源请求执行 WinHttpOpenRequest

关于c - WinHTTP 多个异步请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10661014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com