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 填充缓冲区,但返回读取的零字节