gpt4 book ai didi

sockets - 带有WSASend和OVERLAPPED池的IOCP

转载 作者:行者123 更新时间:2023-12-03 11:53:15 25 4
gpt4 key购买 nike

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

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

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

谢谢。

最佳答案

IOCP并不是这样工作的。

如果您有要取消的挂起操作,请关闭相应的套接字,然后这些操作将完成或失败,并且所有完成操作(包括失败操作)最终都会从IOCP中退出。

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

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

启动操作时,将同时增加连接对象和操作对象上的引用计数。完成后,您将对其进行处理,然后递减计数。当计数达到0时,您将不对对象进行任何处理,并且可以将它们回收到池中以进行重用。

为了帮助彻底关机,我有一个计数器可以等待,该计数器跟踪“ Activity 的”“每个连接”对象(插槽)的数量。

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

我有一些示例代码here,它是一组功能全面的IOCP服务器示例,可能会有所帮助-它是有效的代码,您可以单步执行并从中获得启发。

关于sockets - 带有WSASend和OVERLAPPED池的IOCP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16726026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com