InternetReadFile() 读取数据但返回 false 并将读取的字节数设置为零

Posted

技术标签:

【中文标题】InternetReadFile() 读取数据但返回 false 并将读取的字节数设置为零【英文标题】:InternetReadFile() reads data but returns false and sets number of bytes read to zero 【发布时间】:2011-12-30 14:40:26 【问题描述】:

使用 Wininet 进行异步请求,当使用 INTERNET_STATUS_REQUEST_COMPLETE 调用状态回调函数时,我得到 http 状态码。

result = HttpQueryInfo(
    this->requestHandle,
    HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
    &value,
    &sizeofDword,
    &index);

返回的状态码是 200。之后,我调用 InternetReadFile()。

result = InternetReadFile(
    this->requestHandle,
    ((char*)(this->buffer)) + this->totalBytesReceived,
    this->bufferSize - this->totalBytesReceived,
    &bytesRead);

this->totalBytesReceived += bytesRead;

它返回 true 并将 lpNumberOfBytesRead 设置为零。 GetLastError() 返回 ERROR_IO_PENDING,然后我等待使用 INTERNET_STATUS_REQUEST_COMPLETE 再次调用回调函数。

发生这种情况时,InternetReadFile() 返回 true 并再次将 lpNumberOfBytesRead 设置为零。

如果我调试应用程序,我可以在第一个 InternetReadFile() 之后看到响应数据已经在 lpBuffer 上。此外,如果我在 InternetReadFile() 之前调用 Sleep() 一秒钟,InternetReadFile() 可以正常工作。

Sleep(1000);

result = InternetReadFile( ...

我是否缺少任何步骤?

【问题讨论】:

所以你的代码中有一个 InternetSetStatusCallback() 吗?而行为不端的实际 InternetReadFile() 调用不是您发布的那个?难以诊断隐形代码。 @HansPasant 是的,显示错误行为的 InternetReadFile() 是已发布的。你认为我应该发布代码的任何其他部分吗? 【参考方案1】:

我也遇到过类似的问题,即使使用 Sleep(1000) 还是一样。我正在连接到第 3 方相机流,我已经在调试版本上尝试过,效果很好。但是当我回到发布版本时,它就不起作用了。

我通过将 HttpOpenRequest 的 lplpszAcceptTypes 更改为 NULL 来修复它,然后一切都开始工作了。

好像WinINet处理网络连接时,不同类型的手机/操作系统/调试或发布二进制版本/有某种我们不可能知道的不同操作。

【讨论】:

以上是关于InternetReadFile() 读取数据但返回 false 并将读取的字节数设置为零的主要内容,如果未能解决你的问题,请参考以下文章

InternetReadFile 因分块响应而失败

InternetReadFile 仅读取 10kb

InternetReadFile 返回损坏的响应

InternetReadFile 填充缓冲区,但返回读取的零字节

C++ WinINet InternetReadFile函数刷新

异步使用 InternetReadFile() 的正确方法