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