这是一个使用IOCP的套接字的服务器。 我初学了一个OVERLAPPED池,用于发送WSASend()调用。 每次WSASend()调用都会从池中取出一个OVERLAPPED指针,并在通知时将其放回IOCP工作线程中。
但是,当客户端断开连接时,挂起的WSASend()调用的某些会被删除,因此我没有机会回收从池中取出的OVERLAPPED指针。
如何在确保他们不会到达IOCP工作人员的同时取消100%所有待处理的WSASend()调用,这样我可以在断开连接时手动回收OVERLAPPED指针?
感谢。
答案 0 :(得分:2)
这不是IOCP的工作方式。
如果您有要取消的待处理操作,则关闭相应的套接字,操作将完成或失败,所有完成(包括失败)最终将从IOCP中出来。
你需要等待它发生,一旦它发生,你就可以关闭。
我倾向于做的是“每个连接”结构,其中包含套接字并用作完成密钥。然后,我有“每个操作”结构,其中包括OVERLAPPED
,并且还包括哪些操作类型,使用的I / O缓冲区和其他内容的详细信息。这两种结构都是参考计数。
启动操作时,您可以在连接对象和操作对象上增加引用计数。完成后,您将对其进行处理,然后减少计数。当计数达到0时,您没有对这些对象进行任何操作,可以将它们循环到池中以便重复使用。
为了帮助干净关闭,我有一个计数器,我可以在那里跟踪每个连接对象(套接字)的“活动”数量。
要关闭,请中止所有连接,然后等待连接计数器达到零。此时,您的所有对象都被销毁或者在您的池中,您可以清理。
我有一些示例代码,here,这是一组功能齐全的IOCP服务器示例,可能有所帮助 - 它是可以逐步完成的工作代码,如果没有别的话,可以从中获取想法。