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

标签 wininet

我有使用 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/

相关文章:

visual-c++ - 如何构造WININET的HttpSendRequest方法

c - 使用 WinAPI 的 InternetReadFile() 进行长轮询

c++ - 异步模式下的 InternetOpenUrl

delphi - InternetReadFile 的常见平均缓冲区大小是多少?

windows - WinINET 是可重入的吗?

c - FTP使用Socket编程

c++ - WinInet InternetReadFile 返回 0x8007007a(传递给系统调用的数据区域太小)

c# - WININET.InternetConnect 在 Windows 8 中失败

winapi - Winsock 使用系统代理设置

c - Wininet 不向服务器发送 cookie