gpt4 book ai didi

c++ - 使用 WSASend 的一些 OVERLAPS 没有使用 GetQueuedCompletionStatus 及时返回?

转载 作者:可可西里 更新时间:2023-11-01 11:22:45 25 4
gpt4 key购买 nike

背景:我正在使用 CreateIoCompletionPort、WSASend/Recv 和 GetQueuedCompletionStatus 在我的服务器上执行重叠套接字 io。对于流量控制,当发送到客户端时,我只允许在所有挂起的 OVERLAP 从 IOCP 弹出时调用几个 WSASend()。

问题:最近,有时 OVERLAP 没有返回到 IOCP。调用 GetQueuedCompletionStatus 的线程没有得到它们,它们保留在我的本地待处理队列中。我已经验证客户端确实从套接字接收数据并且套接字已连接。进行 WSASend() 调用时未返回任何错误。如果没有像下面这样的外部刺激,重叠就“永远不会”回来:

  1. 断开套接字与客户端或服务器的连接,立即允许 GetQueuedCompletionStatus 线程检索 OVERLAP
  2. 在所有 OVERLAP 突然从队列中弹出之前,对 WSASend() 进行额外调用,有时需要多次调用。

问题:有人见过这种行为吗?关于是什么原因造成的任何想法?

谢谢,杰弗里

最佳答案

如果 TCP 窗口已满,

WSASend() 可能无法及时完成。在这种情况下,堆栈无法再发送任何数据,因此您的 WSASend() 会等待,直到 TCP 堆栈可以发送更多数据后才会完成。

如果您碰巧在您的客户端和服务器之间有一个协议(protocol),该协议(protocol)本身没有内置流量控制,并且您没有根据写入完成自行进行任何流量控制,而只是尽可能快地发送数据发送然后你可能会到达一个点,网络或你的客户端无法跟上并且 TCP 流量控制开始(当 TCP 窗口变满时)。如果您继续通过对 WSASend() 的额外调用来异步触发数据,那么最终您将遍历机器上的所有非分页内存,到那时所有赌注都将取消(驱动程序可能导致盒子蓝屏的可能性很高)。

因此,总而言之,重叠套接字写入完成的时间有时会比您预期的要长。在您的示例中,我希望您在关闭套接字时获得的完成都是失败的?

我在我的博客上对此进行了更多讨论;这里:http://www.lenholgate.com/blog/2008/07/write-completion-flow-control.html在这里:http://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-control-and-asynchronous-writes.html

关于c++ - 使用 WSASend 的一些 OVERLAPS 没有使用 GetQueuedCompletionStatus 及时返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1145220/

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