2

这是一个使用 IOCP 的带有套接字的服务器。我初始化了一个 OVERLAPPED 池,用于发送 WSASend() 调用。每个 WSASend() 调用都会从池中取出一个 OVERLAPPED 指针,并在收到通知时将其放回 IOCP 工作线程中。

但是,当客户端断开连接时,一些挂起的 WSASend() 调用被丢弃,因此我没有机会回收从池中取出的 OVERLAPPED 指针。

如何在确保它们不会到达 IOCP 工作程序的同时取消 100% 所有挂起的 WSASend() 调用,以便我可以在断开连接时手动回收 OVERLAPPED 指针?

谢谢。

4

1 回答 1

2

这不是 IOCP 的工作方式。

如果您有要取消的待处理操作,则关闭相应的套接字,操作将完成或失败,所有完成(包括失败)最终都将来自 IOCP。

您需要等待这种情况发生,一旦发生,您就可以关闭了。

我倾向于做的是有一个包含套接字并用作完成键的“每个连接”结构。然后,我有“每个操作”结构,其中包括OVERLAPPED操作类型、使用的 I/O 缓冲区和其他内容的详细信息。这两个结构都是引用计数的。

启动操作时,您会增加连接对象和操作对象的引用计数。当你得到一个完成时,你处理它,然后减少计数。当计数达到 0 时,您不会对对象进行任何操作,它们可以被回收到池中以供重复使用。

为了帮助彻底关闭,我有一个计数器,我可以等待它跟踪“活动”“每个连接”对象(套接字)的数量。

要关闭您中止所有连接,然后等待连接计数器达到零。那时,您的所有对象要么被销毁,要么在您的池中,您可以进行清理。

我有一些示例代码,这里是一组功能齐全的 IOCP 服务器示例,可能会有所帮助 - 它是工作代码,您可以单步执行并从中获取想法。

于 2013-08-15T08:34:17.147 回答