首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WSASend和重叠池的IOCP

WSASend和重叠池的IOCP
EN

Stack Overflow用户
提问于 2013-05-24 00:26:54
回答 1查看 1.5K关注 0票数 2

这是一个使用IOCP的带有套接字的服务器。我使用一个重叠池来发送WSASend()调用。每个WSASend()调用从池中取出一个重叠指针,并在通知时将其放回IOCP工作线程中。

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

如何取消所有挂起的WSASend()调用,同时确保它们不会到达IOCP工作人员,以便在断开连接时手动回收重叠的指针?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-08-15 08:34:17

IOCPs不是这样工作的。

如果您有要取消的挂起操作,则关闭相应的套接字,操作将完成或失败,所有完成(包括故障)最终将从IOCP中出来。

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

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

启动操作时,可以增加连接对象和操作对象的引用计数。当你得到一个完成,你处理它,然后减少计数。当计数达到0时,您就没有对对象做任何工作,并且可以将它们回收到池中进行重用。

为了帮助清理关机,我可以等待一个计数器来跟踪每个连接对象(套接字)的“活动”数量。

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

我有一些示例代码,这里,它是一组功能齐全的IOCP服务器示例,可能会有所帮助--这是一种工作代码,您可以逐步了解它,并从中获得想法(如果没有其他的话)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16726026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档