这是一个使用IOCP的带有套接字的服务器。我使用一个重叠池来发送WSASend()调用。每个WSASend()调用从池中取出一个重叠指针,并在通知时将其放回IOCP工作线程中。
但是,当客户端断开连接时,一些挂起的WSASend()调用将被删除,因此我没有机会回收从池中取出的重叠指针。
如何取消所有挂起的WSASend()调用,同时确保它们不会到达IOCP工作人员,以便在断开连接时手动回收重叠的指针?
谢谢。
发布于 2013-08-15 08:34:17
IOCPs不是这样工作的。
如果您有要取消的挂起操作,则关闭相应的套接字,操作将完成或失败,所有完成(包括故障)最终将从IOCP中出来。
您需要等待这种情况发生,一旦发生了,您就可以关闭了。
我倾向于做的是拥有一个“每个连接”结构,它包含套接字,并用作完成键。然后,我有“每个操作”结构,其中包括OVERLAPPED,还包括哪种操作类型、使用的I/O缓冲区和其他东西的详细信息。这两种结构都是参考计数。
启动操作时,可以增加连接对象和操作对象的引用计数。当你得到一个完成,你处理它,然后减少计数。当计数达到0时,您就没有对对象做任何工作,并且可以将它们回收到池中进行重用。
为了帮助清理关机,我可以等待一个计数器来跟踪每个连接对象(套接字)的“活动”数量。
若要关闭所有连接,请中止所有连接,然后等待连接计数器达到零。此时,您的所有对象要么被销毁,要么在您的池中,您可以清理。
我有一些示例代码,这里,它是一组功能齐全的IOCP服务器示例,可能会有所帮助--这是一种工作代码,您可以逐步了解它,并从中获得想法(如果没有其他的话)。
https://stackoverflow.com/questions/16726026
复制相似问题