Я пишу сервер на основе порта завершения ввода-вывода (исходный код здесь) с помощью Windows DLL API в Python с использованием модуля ctypes. Но это довольно прямое использование API, и этот вопрос адресован тем, кто знаком с IOCP, а не с Python.
Насколько я понимаю в документации для CreateIoCompletionPort, вы указываете свой «определяемый пользователем» ключ завершения, когда вызываете эту функцию с дескриптором файла (в моем случае сокет), который вы связываете с созданным IOCP. Когда вы дойдете до вызова GetQueuedCompletionStatus, вы получите значение ключа завершения вместе с указателем на перекрывающийся объект. Ключ завершения должен идентифицировать, какой перекрывающийся объект и запрос были выполнены.
Однако предположим, что я передаю 100 в качестве ключа завершения в моем вызове CreateIoCompletionPort с перекрывающимся объектом. Когда тот же перекрывающийся объект завершает свой ввод-вывод и возвращается через GetQueuedCompletionStatus, ключ завершения, который сопровождает его, намного больше и не имеет никакого сходства с исходным значением 100.
Я неправильно понимаю, как работает ключ завершения, или я должен ошибаться в исходном коде, который я привел выше?