Я пишу сервер на основе завершения ввода-вывода (source code here), используя API-интерфейс Windows DLL на Python, используя модуль ctypes. Но это довольно прямое использование API, и этот вопрос направлен на тех, кто знает IOCP, а не Python.Порт ввода ввода-вывода ввода-вывода
Насколько я понимаю документацию для CreateIoCompletionPort, вы указываете свой «ключ», заданный пользователем, когда вы вызываете эту функцию с помощью дескриптора файла (в моем случае сокета), который вы связываете с созданным IOCP. Когда вы переходите к вызову GetQueuedCompletionStatus, вы получаете значение ключа завершения вместе с указателем на перекрывающийся объект. Ключ завершения должен определить, что перекрыл объект и запрос.
Однако, скажем, я передаю 100 в качестве ключа завершения в моем вызове CreateIoCompletionPort с перекрывающимся объектом. Когда тот же перекрывающийся объект имеет свой IO, и он возвращается через GetQueuedCompletionStatus, ключ завершения, который сопровождает его, намного больше и не имеет никакого сходства с исходным значением 100.
Я не понимаю, как работает ключ завершения, или Должен ли я делать это неправильно в исходном коде, который я связал выше?
«Скажем, я передаю 100 в качестве ключа завершения в моем вызове CreateIoCompletionPort с перекрывающимся объектом. Когда один и тот же перекрывающийся объект имеет свой IO, и он возвращается через GetQueuedCompletionStatus, ключ завершения, который сопровождает его, намного больше и заставляет не похоже на первоначальное значение 100. " Из моего вопроса и почему я не сравниваю его в исходном коде. Возможно, вы правильно относитесь к перекрываемому объекту, который собирает мусор, но это не имеет отношения к вопросу. – 2009-07-25 05:36:26