"取消准"完成端口的套接字

时间:2015-06-06 22:07:46

标签: c++ sockets winapi winsock iocp

CreateIoCompletionPort()用于将套接字与完成端口相关联。但是,当这个套接字关闭时,我需要"取消关联"它来自完成端口。我怎么能这样做?

2 个答案:

答案 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函数。