CreateIoCompletionPort()
用于将套接字与完成端口相关联。但是,当这个套接字关闭时,我需要"取消关联"它来自完成端口。我怎么能这样做?
答案 0 :(得分:5)
当句柄关闭时,将从端口中删除与I / O完成端口关联的句柄。如果是网络套接字,则通过调用closesocket()
来关闭句柄。
CreateIoCompletionPort的文档包含有关资源处理的备注:
FileHandle参数中传递的句柄可以是支持重叠I / O的任何句柄。最常见的是,这是CreateFile函数使用FILE_FLAG_OVERLAPPED标志(例如,文件,邮件槽和管道)打开的句柄。 其他功能(如socket)创建的对象也可以与I / O完成端口相关联。有关使用套接字的示例,请参阅AcceptEx。句柄只能与一个I / O完成端口关联,并且在建立关联后,句柄仍然与该I / O完成端口关联,直到它关闭。
...
I / O完成端口句柄和与该特定I / O完成端口关联的每个文件句柄称为对I / O完成端口的引用。当没有更多引用时,将释放I / O完成端口。因此,必须正确关闭所有这些句柄才能释放I / O完成端口及其关联的系统资源。满足这些条件后,通过调用CloseHandle函数关闭I / O完成端口句柄。
答案 1 :(得分:4)
微软显然不希望普通用户这样做,但是,有一种官方记录的方式(并且它只需要一个挖掘的疯子来找到它):
调用NtSetInformationFile
,为FileReplaceCompletionInformation
参数传递值FileInformationClass
,即可完成此操作。 (此值在FILE_INFORMATION_CLASS
)中定义
此参数值的说明副本(强调我的):
更改或删除指定文件句柄的I / O完成端口。 调用者提供指向FILE_COMPLETION_INFORMATION结构的指针 指定端口句柄和完成键。如果端口句柄是 非NULL,此句柄指定要关联的新I / O完成端口 文件句柄。 删除与之关联的I / O完成端口 文件句柄,将结构中的端口句柄设置为NULL。 要获得端口句柄,用户模式调用者可以调用CreateIoCompletionPort函数。