在幾臺機器上測驗我的應用程式表明 WinApiHttpSendRequest有時運行緩慢。在非虛擬機上大約需要 100-~300 毫秒,在虛擬機上通過curl. HttpSendRequest但是在使用 Win10 的虛擬機上發送請求需要 ~5s 而在 Win7 - ~20s 上。
這是一個示例代碼:
...
auto success = OpenInternet();
if (success) {
success = AssignHandles(request);
}
if (success) {
success = SendHttpRequest(request);
}
...
bool OpenInternet(bool reset)
{
if (openHandle == NULL) {
openHandle = InternetOpen(userAgent.c_str(), openAccessType, proxyConfigString, NULL, 0);
if (openHandle != NULL) {
if (IsWindowsVistaOrGreater()) {
BOOL enable = TRUE;
InternetSetOption(openHandle, INTERNET_OPTION_HTTP_DECODING, &enable, sizeof(enable));
}
}
}
return (openHandle == NULL);
}
bool AssignHandles(Request& request)
{
bool success = AssignConnectHandle(request);
if (success) {
success = AssignRequestHandle(request);
if (!success) {
InternetCloseHandle(request.connectHandle);
}
}
return success;
}
bool AssignConnectHandle(Request& request)
{
request.connectHandle = InternetConnect(
openHandle,
request.host.c_str(),
(request.secure ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT),
NULL,
NULL,
INTERNET_SERVICE_HTTP,
0,
INTERNET_NO_CALLBACK);
return (request.connectHandle == NULL);
}
bool AssignRequestHandle(Request& request)
{
LPCWSTR pszAcceptTypes[] = {acceptTypeHeader.c_str(), NULL};
request.requestHandle = HttpOpenRequest(
request.connectHandle,
GetRequestMethod(request.type).c_str(),
request.path.c_str(),
httpVersion.c_str(),
NULL,
pszAcceptTypes,
GetRequestFlags(request.secure),
NULL);
return (request.connectHandle == NULL);
}
bool SendHttpRequest(Request& request)
{
std::wstring headers = PrepareHeaders(request);
bool success = HttpSendRequest(
request.requestHandle,
headers.empty() ? NULL : headers.c_str(),
(uint32_t)headers.size(),
(request.data != NULL) ? (void*)request.data->c_str() : NULL,
(request.data != NULL) ? (uint32_t)request.data->length() : 0)
!= 0;
return success;
}
uj5u.com熱心網友回復:
可能是因為 VirtualBox 的網路實作有點笨重(ish)。對我來說,它制作了一個全新的網路配接器(基本上是虛擬以太網)。它的作用是,VM認為它已連接到以太網。然后 VirtualBox 后端通過我的普通 Wi-Fi 重定向它。這類事情非常復雜,所以肯定只是將虛擬以太網轉換為 Wi-Fi 的開銷。
(如果您實際使用的是以太網,請將我所有的“Wi-Fi”字詞替換為“物理以太網”)
編輯: curl可能使用不同的 API 進行不使用 WinAPI 的網路呼叫,所以它也可能只是一個 WinAPI 問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/438372.html
上一篇:初始化VT_VARIANT的PROPVARIANT結構|VT_VECTOR型別
下一篇:接收Win32事件的順序
