IO完成端口密钥混乱

6 python windows ctypes winsock iocp

我正在使用ctypes模块在Python中使用Windows DLL API 编写基于IO完成端口的服务器(此处为源代码).但这是API的直接用法,这个问题针对的是那些了解IOCP而不是Python的人.

据我了解CreateIoCompletionPort的文档,当您使用文件句柄(在我的情况下是套接字)调用此函数时,您指定了"用户定义的"完成键,您正在与创建的IOCP关联.当您调用GetQueuedCompletionStatus时,您将获得一个完成键值以及指向重叠对象的指针.完成键应标识重叠的对象和请求已完成的内容.

但是,假设我在带有重叠对象的CreateIoCompletionPort调用中传入100作为完成键.当相同的重叠对象完成其IO并且它通过GetQueuedCompletionStatus返回时,伴随它的完成键要大得多,并且与原始值100没有相似之处.

我误解了完成键是如何工作的,或者我在上面链接的源代码中是否做错了?

Tim*_*ter 1

GetQueuedCompletionStatus返回两个东西,一个OVERLAPPED结构和一个完成键。完成键表示每个设备的信息,OVERLAPPED结构体表示每个调用的信息。完成键应该与调用中给出的键匹配CreateIoCompletionPort。通常,您可以使用指向包含连接信息的结构的指针作为完成键。

看来您没有对completionKey返回的执行任何操作GetQueuedCompletionStatus

我猜你想要:

if completionKey != acceptKey:
    Cleanup()
    ...
Run Code Online (Sandbox Code Playgroud)

编辑:

Python 是否以某种方式知道Win32 API 正在异步使用OVERLAPPED中创建的结构CreateAcceptSocket并防止它被 GC 处理?