我有使用 WinInet API 异步执行 HTTP 请求的代码。总的来说,我的代码有效,但我对“正确”的做事方式感到困惑。在 InternetReadFile() 的文档中,它指出:
To ensure all data is retrieved, an application must continue to call the InternetReadFile function until the function returns TRUE and the lpdwNumberOfBytesRead parameter equals zero.
但在异步模式下,它可能会(也可能不会)返回 false 和 ERROR_IO_PENDING
错误,表明它将异步完成工作,并在完成时调用我的回调。如果我按字面意思阅读文档,似乎异步调用也可以只对请求的缓冲区进行部分读取,并要求调用方继续调用 InternetReadFile 直到遇到 0 字节的读取。
同步使用 InternetReadFile()
的典型实现如下所示:
while(InternetReadFile(Request, Buffer, BufferSize, &BytesRead) && BytesRead != 0)
{
// do something with Buffer
}
但由于任何对 InternetReadFile()
的调用都可能发出信号表明它将异步完成工作(并且可能读取部分,但不是全部您的请求),它变得更加复杂。如果我转向 MSDN sample code作为指导,实现很简单,只需调用一次 InternetReadFile()
,并期望一次返回立即或异步读取整个请求的缓冲区。这是使用此函数的正确方法,还是 MSDN 示例代码忽略了 InternetReadFile()
仅读取部分请求缓冲区的可能性?
最佳答案
在仔细阅读异步示例之后,我现在看到它正在重复读取,直到遇到成功读取 0 字节。因此,要回答我自己的问题,您必须一遍又一遍地调用 InternetReadFile(),并为同步或异步响应做好准备。
关于wininet - 异步使用 InternetReadFile() 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15748092/