从完成端口"Un-associate"套接字
"Un-associate" socket from completion port
CreateIoCompletionPort()
用于关联套接字和完成端口。然而,当这个套接字关闭时,我需要将它与完成端口"解除关联"。我该怎么做呢?
微软显然不希望普通用户这样做,但尽管如此,有一个官方文档的方法(它只需要大量的挖掘来找到它):
调用NtSetInformationFile
,为FileInformationClass
参数传递值FileReplaceCompletionInformation
,将完成此操作。(此值在FILE_INFORMATION_CLASS
中定义)
该参数值(强调我的)的描述的副本:
更改或删除指定文件句柄的I/O完成端口。调用者提供一个指向FILE_COMPLETION_INFORMATION结构的指针它指定一个端口句柄和一个完成键。如果端口句柄是非null,此句柄指定要关联的新I/O完成端口文件句柄。移除I/O完成端口文件句柄,将结构中的端口句柄设置为NULL。要获取端口句柄,用户模式调用者可以调用CreateIoCompletionPort函数。
当句柄关闭时,与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完成端口句柄。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- MSG_WAITALL的套接字发送得到了 22 EINVAL
- C++套接字客户端到 Python 服务器未创建连接
- 在不知道套接字的情况下关闭网络连接
- C++套接字对不读/写父/子
- 非更新套接字消息
- SIGSEGV on Boost UDP 套接字关闭 - tcache_get at malloc.c.
- 将"uint8_t"(从套接字读取)隐式转换为"char"安全吗
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 从完成端口"Un-associate"套接字