I / O完成端口,如何释放每个套接字上下文和每个I / O上下文?

时间:2009-03-24 12:24:39

标签: iocp

我在UDP套接字上使用IOCP,UDP套接字可能在另一个线程中关闭。那么,如何安全地释放与SOCKET相关的Per Socket Context和Per I / O Context?

当我关闭套接字时,内核队列中仍然会有未完成的I / O请求。

如果我在套接字关闭时释放上下文,GetQueueCompletionStatus可能会失败。

现在,我的问题是何时释放上下文?

4 个答案:

答案 0 :(得分:3)

我在每个套接字和每个I / O数据结构上使用引用计数。它使这种事情变得容易,因为当它们的引用降为0时它们被删除。对于一些显示一种方法的示例代码,您可以查看我可以从here下载的免费IOCP框架。

答案 1 :(得分:1)

使用mutex在代码的关键部分强制执行互斥,以检查套接字的可用性,并在必要时将其打开。将套接字锁定到该线程,并在完成后适当地释放它。

答案 2 :(得分:0)

我重用了我的每个套接字结构。在收到该连接所需的所有读写操作的完成事件后,我使用TF_DISCONNECTTF_REUSE_SOCKET标志调用TransmitFile以重置套接字而不必关闭它。一旦TransmitFile调用的完成事件发生,我也会重置每个连接数据。

答案 3 :(得分:0)

先关闭套接字。您将从GetQueuedCompletionStatus获得错误(我认为它是ERROR_OPERATION_ABORTED),然后是时候释放结构了。到那时,内核队列中没有其他未完成的请求,完成数据包按FIFO顺序维护,错误数据包肯定是此连接的最后一个。