Я использую GetQueuedCompletionStatusEx()
API, и я только что понял, что это
может действительно прочитать N пакетов OVERLAPPED всего за 1 системный вызов, а не только 1 OVERLAPPED, как GetQueuedCompletionStatus()
, но я обеспокоен тем, что я не могу ничего знать о per-OVERLAPPED код ошибки.
В то время как GetQueuedCompletionStatus()
возвращает только 1 OVERLAPPED за вызов, это дает мне возможность проверить, вызов GetLastError()
, последняя ошибка для текущего пакета OVERLAPPED.
Как я мог сделать это с GetQueuedCompletionStatusEx()
который фактически возвращает N пакетов OVERLAPPEDs, но не N кодов ошибок?
Я прочитал об этом по телефону GetOverlappedResult()
Вы можете достичь этого, но моя точка зрения такова: если я позвоню GetQueuedCompletionStatusEx()
чтобы получить N пакетов OVERLAPPEDs, а затем я должен вызвать другой системный вызов для КАЖДЫЙ Преимущество вызова 1 syscall для получения N OVERLAPPEDs бессмысленно, так как вы вызовете 1 + N syscalls. На данный момент я мог бы просто остаться с GetQueuedCompletionStatus()
и вызывать только N системных вызовов (для N ПЕРЕКРЫТЫХ) вместо 1 + N.
Кто-нибудь знает больше об этом?
Статус завершения сохраняется в OVERLAPPED.Internal
поле. Но, как вы заметили, это собственный код состояния API, а не код ошибки WinAPI. Простой способ перевести это позвонить GetOverlappedResult (). Неважно, что вы принимаете за bWait аргумент, он всегда вернется немедленно. Используйте WSAGetOverlappedResult () для сокетов.
Других решений пока нет …