HTTP 请求导致堆损坏
http requests are causing heap corruption?
我正在尝试从我的c ++项目向php脚本发送一些数据,如下所示:
void sendThatBitch()
{
DWORD dwSize = 0;
DWORD dwDownloaded = 0;
LPSTR pszOutBuffer;
vector <string> vFileContent;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen(L"WinHTTP Example/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
{
cout << "WinHttpOpenn";
hConnect = WinHttpConnect(hSession, L"example.com", INTERNET_DEFAULT_HTTP_PORT, 0);
}
// Create an HTTP request handle.
if (hConnect)
{
cout << "WinHttpConnectn";
string req = "/script.php?data1=";
req += DATA1;
req += "&data2=";
req += DATA2;
req += ' ';
WCHAR* str = new WCHAR(req.size() - 1);
MultiByteToWideChar(0, 0, req.c_str(), req.size(), str, req.size());
hRequest = WinHttpOpenRequest(hConnect, L"GET", str, NULL, WINHTTP_NO_REFERER, NULL, NULL);
}
// Send a request.
if (hRequest)
{
cout << "WinHttpOpenRequestn";
bResults = WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
}
// End the request.
if (bResults)
{
cout << "WinHttpSendRequestn";
bResults = WinHttpReceiveResponse(hRequest, NULL);
}
// Close any open handles.
if (hRequest)
{
WinHttpCloseHandle(hRequest);
}
if (hConnect)
{
WinHttpCloseHandle(hConnect);
}
if (hSession)
{
WinHttpCloseHandle(hSession);
}
}
现在我在这里的问题是大多数时候都会发生的事情,但并非总是如此。有时数据确实会发送,但是当我收到错误时,它看起来像这样:
检测到严重错误 c0000374 应用程序.exe已触发 断点。
申请.exe 0x77EFE653(ntdll.dll)的首次机会例外: 0xC0000374:堆已损坏(参数:0x77F34268)。
应用程序中0x77EFE653 (ntdll.dll) 处未处理的异常.exe: 0xC0000374:堆已损坏(参数:0x77F34268)。
这发生在吃WinHttpOpenRequest
或WinHttpSendRequest
上。有没有人知道为什么大多数时候会发生这种情况?
注意:此代码中提到的域是假的,而不是真实代码中使用的域。
我在上面的评论中点击了 ChrisWard1000 的链接,现在它的工作原理是这样的:
if (hConnect)
{
cout << "WinHttpConnectn";
string req = "/script.php?data1=";
req += DATA1;
req += "&data2=";
req += DATA2;
req += ' ';
int wchars_num = MultiByteToWideChar(CP_UTF8, 0, req.c_str(), -1, NULL, 0);
wchar_t* str = new wchar_t[wchars_num];
MultiByteToWideChar(0, 0, req.c_str(), req.size(), str, req.size());
hRequest = WinHttpOpenRequest( hConnect, L"GET", str, NULL, WINHTTP_NO_REFERER, NULL, NULL);
delete[] str;
}
+1 这个建议,谢谢你们。
相关文章:
- 为什么会发生堆损坏
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在boost beast http请求中设置http头
- 发送一个带有libcurl C++问题的帖子请求:s
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 在多个核心中处理一个HTTP请求
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 错误:请求非类类型为"MULTIMEDIA_FILME [500]"的成员|
- 使用 Winsock2.h C++向不和谐 API 发送 HTTP 请求时出现问题
- 每个服务器请求的内存预算
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- std::getline没有在while循环中重新请求用户输入
- HTTP 请求导致堆损坏