WinInet InternetReadFile返回0x8007007a(传递给系统调用的数据区域太小)
WinInet InternetReadFile returns 0x8007007a (The data area passed to a system call is too small)
我对WinInet的InternetReadFile(C++)有问题
在极少数情况下,函数会失败,GetLastError会返回上述错误0x8007007a(根据ErrorLookup,这对应于"传递给系统调用的数据区域太小")。
我对此有几个问题:
- 为什么这种情况在一些罕见的情况下发生,但在其他情况下有效很好(我当然是说总是下载相同的~15MBzip文件)
- 这真的与传递给API调用的缓冲区大小有关吗?我为这个调用使用了1024字节的常量缓冲区大小。我应该使用更大的缓冲区大小吗?如果是,我如何知道"正确"的缓冲区大小
- 如果出现此错误,我可以在运行时做些什么来恢复
添加一个代码片段(注意,这不会按原样工作,因为需要一些初始化代码):
#define HTTP_RESPONSE_BUFFER_SIZE 1024
std::vector<char> responseBuffer;
DWORD dwResponseBytesRead = 0;
do
{
const size_t oldBufferSize = responseBuffer.size();
responseBuffer.resize(oldBufferSize + HTTP_RESPONSE_BUFFER_SIZE);
// Now we read again to the last place we stopped
// writing in the previous iteration.
dwResponseBytesRead = 0;
BOOL bInternetReadFile = ::InternetReadFile(hOpenRequest, // hFile. Retrieved from a previous call to ::HttpOpenRequest
(LPVOID)&responseBuffer[oldBufferSize], // lpBuffer.
HTTP_RESPONSE_BUFFER_SIZE, // dwNumberOfBytesToRead.
&dwResponseBytesRead); // lpdwNumberOfBytesRead.
if(!bInternetReadFile)
{
// Do clean up and exit.
DWORD dwErr = ::GetLastError(); // This, in some cases, will return: 0x7a
HRESULT hr = HRESULT_FROM_WIN32(dwErr); // This, in some cases, will return: 0x8007007a
return;
}
// Adjust the buffer according to the actual number of bytes read.
responseBuffer.resize(oldBufferSize + dwResponseBytesRead);
}
while(dwResponseBytesRead != 0);
这是InternetReadFile:的一个记录错误
WinINet尝试一次一行地将HTML写入lpBuffer缓冲区。如果应用程序的缓冲区太小,无法容纳至少一行生成的HTML,则会返回错误代码error_INSUFFIENT_buffer,以指示应用程序需要更大的缓冲区。
因此,您应该通过增加缓冲区大小来处理这个错误。只需将尺寸增加一倍,必要时可重复使用。
有一些不一致之处值得商榷。目前还不清楚你是否正在阅读一个HTML文件,15MB似乎太多了。另一个是,这个错误应该会很好地重复。但最麻烦的是错误代码值,它被封装在HRESULT中,这是COM组件将返回的错误代码。您应该从GetLastError()返回一个Windows错误代码,只有0x7a,而不是0x8007007a。
请确保您的错误检查是正确的。仅当InternetReadFile()返回FALSE时调用GetLastError()。如果检查出来(请始终发布一个片段),那么请考虑这个错误实际上是在上游生成的,可能是防火墙或脆弱的反恶意软件。
相关文章:
- 在 c++ 中解析数据包数据的最佳方法是什么?
- C++:如何通过 curl 调用使用 HTTP post 请求发送二进制数据(protobuf 数据)
- 我无法将数据从数据网格列传输到 C# 中的数组以获取文本框建议收集数据
- 如何用尽可能少的数据将数据缓冲区计算为零校验和值
- 如何将通过TCP发送数据的数据从C++转换为Java
- 从QML ListView中QABStractListModel中的数据操纵数据
- Windivert-修改数据包数据/有效载荷内容
- 如何从C ++的输出中删除垃圾数据(垃圾数据)
- 如何编写循环以通过列表迭代并打印列表中每个元素的数据的数据
- 加入线程后,是访问共享数据的数据竞赛吗?
- 亚类FSTREAM和解密数据即时数据
- 将数据从数据阅读器终端实时获取到GUI
- 将数据从数据读取器终端获取到GUI(QtCreator)
- 使用 libpcap 读取数据包数据
- SDL_net UDP 数据包数据
- 用于插入大部分排序数据的数据结构,这些数据将保持排序顺序
- 从Qt应用程序获取原始数据包数据
- C++:用于高效插入和检索自定义数据的数据结构
- 如何将用户输入的数据从数据网格视图获取到窗口窗体图
- 将libpcap数据包数据从const u_char*复制到另一个const u_car*