我在UDP套接字上使用IOCP,UDP套接字可能在另一个线程中关闭。那么,如何安全地释放与SOCKET相关的Per Socket Context和Per I / O Context?
当我关闭套接字时,内核队列中仍然会有未完成的I / O请求。
如果我在套接字关闭时释放上下文,GetQueueCompletionStatus可能会失败。
现在,我的问题是何时释放上下文?
答案 0 :(得分:3)
我在每个套接字和每个I / O数据结构上使用引用计数。它使这种事情变得容易,因为当它们的引用降为0时它们被删除。对于一些显示一种方法的示例代码,您可以查看我可以从here下载的免费IOCP框架。
答案 1 :(得分:1)
使用mutex在代码的关键部分强制执行互斥,以检查套接字的可用性,并在必要时将其打开。将套接字锁定到该线程,并在完成后适当地释放它。
答案 2 :(得分:0)
我重用了我的每个套接字结构。在收到该连接所需的所有读写操作的完成事件后,我使用TF_DISCONNECT
和TF_REUSE_SOCKET
标志调用TransmitFile
以重置套接字而不必关闭它。一旦TransmitFile
调用的完成事件发生,我也会重置每个连接数据。
答案 3 :(得分:0)
先关闭套接字。您将从GetQueuedCompletionStatus获得错误(我认为它是ERROR_OPERATION_ABORTED),然后是时候释放结构了。到那时,内核队列中没有其他未完成的请求,完成数据包按FIFO顺序维护,错误数据包肯定是此连接的最后一个。