我有使用 WinInet API 异步执行 HTTP 请求的代码。一般来说,我的代码有效,但我对“正确”的做事方式感到困惑。在InternetReadFile()的文档中,它指出:
为确保检索到所有数据,应用程序必须继续调用 InternetReadFile 函数,直到该函数返回 TRUE 并且 lpdwNumberOfBytesRead 参数等于零。
但在异步模式下,它可能(也可能不会)返回 false 和一个错误ERROR_IO_PENDING
,表明它将异步完成工作,并在完成时调用我的回调。如果我从字面上阅读文档,似乎异步调用也可以只对请求的缓冲区进行部分读取,并要求调用者继续调用 InternetReadFile 直到遇到 0 字节的读取。
使用InternetReadFile()
同步的典型实现如下所示:
while(InternetReadFile(Request, Buffer, BufferSize, &BytesRead) && BytesRead != 0)
{
// do something with Buffer
}
但是有可能任何一个调用都InternetReadFile()
可能表明它将异步完成工作(可能读取部分,但不是您的全部请求),它变得更加复杂。如果我转向MSDN 示例代码寻求指导,那么实现很简单,只需调用InternetReadFile()
一次,并期望单个返回立即或异步读取整个请求的缓冲区。这是使用此功能的正确方法,还是 MSDN 示例代码忽略了InternetReadFile()
仅读取部分请求缓冲区的可能性?