c++ - GetQueuedCompletionStatusEx() 不返回 per-OVERLAPPED 错误代码

标签 c++ c windows winapi iocp

我正在使用 GetQueuedCompletionStatusEx() api,我刚刚意识到它 确实可以在 1 个系统调用中读取 N 个 OVERLAPPED 数据包,而不是只有 1 个 OVERLAPPED,例如 GetQueuedCompletionStatus(),但我担心的是我对每个 OVERLAPPED 错误代码一无所知。

虽然 GetQueuedCompletionStatus() 每次调用仅返回 1 个 OVERLAPPED,但它使我能够调用 GetLastError() 检查当前 OVERLAPPED 数据包的最后一个错误.

我如何使用 GetQueuedCompletionStatusEx() 执行此操作,它实际上返回 N 个 OVERLAPPED 数据包,但不返回 N 个错误代码?

我已经阅读了通过调用 GetOverlappedResult() 可以实现的内容,但我的观点是:如果我调用 GetQueuedCompletionStatusEx() 来获取 N 个 OVERLAPPEDs 数据包,并且然后我必须为其中的 EACH 调用另一个系统调用,调用 1 个系统调用以获得 N 个 OVERLAPPED 的好处是毫无意义的,因为您将调用 1+N 个系统调用。在这一点上,我可以简单地使用 GetQueuedCompletionStatus() 并仅调用 N 次系统调用(对于 N 次 OVERLAPPED)而不是 1+N 次。

有人知道吗?

最佳答案

完成状态存储在 OVERLAPPED.Internal 字段中。但正如您所指出的,那是 native api 状态代码,而不是 winapi 错误代码。翻译它的一种简单方法是调用 GetOverlappedResult() .无论您为 bWait 参数传递什么,它总是会立即返回。对套接字使用 WSAGetOverlappedResult()。

关于c++ - GetQueuedCompletionStatusEx() 不返回 per-OVERLAPPED 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22575832/

相关文章:

c++ - 编译器库与操作系统库

c++ - 如何使用 clang++ 链接到 boost in/usr/local 编译?

c - 使用 GDB 时,如何查看 GDB 停止在哪条 C(而非汇编)指令上?

windows - 将 cordova 应用程序部署到真正的 Windows Phone 8.1 设备时出现问题

windows - 为什么 Windows 和 Linux 系统的创建者选择了不同的方式来支持 Unicode?

c++ - SetupDiGetDeviceProperty 使用示例

c++ - 调整 "std::vector"的大小;哪些元素受到影响?

c - 如何将子进程的输出重定向到系统日志?

c - 为什么父进程死亡会杀死子进程

c++ - 写入共享内存的频率限制?