有些使用WSASend的OVERLAPS没有及时使用GetQueuedCompletionStatus返回?

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

问题:最近,OVERLAPs没有返回到IOCP时出现了occassions。 调用GetQueuedCompletionStatus的线程不会获取它们,它们将保留在我的本地待定队列中。 我已经validation客户端接收到的数据从套接字和套接字连接。 调用WSASend()时,不会返回任何错误。 没有像以下这样的外部刺激,OVERLAPs只是“永不”回来:

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

问:有没有人看过这种types的行为? 任何想法是什么造成这个?

谢谢,杰弗里

Solutions Collecting From Web of "有些使用WSASend的OVERLAPS没有及时使用GetQueuedCompletionStatus返回?"

如果TCP窗口已满, WSASend()可能无法及时完成。 在这种情况下,堆栈不能发送更多的数据,所以你的WSASend()等待,直到TCP堆栈发送更多的数据才能完成。

如果你碰巧在你的客户端和服务器之间有一个在协议本身没有内置流量控制的协议,而且你没有根据写入完成来做任何流量控制,而只是发送数据的速度与你的服务器发送一样快,那么你可能会达到网络或客户端无法跟上并且TCP流量控制开始(TCP窗口满时)的时间点。 如果您继续通过额外的WSASend()调用来异步触发数据,那么最终您将咀嚼机器上的所有非分页内存,此时所有投注都将关闭(一个驱动程序的可能性很高可能会导致蓝屏)。

所以,总而言之,来自重叠套接字写入的完成可能并且有时会花费更长的时间才能超出您的预期。 在你的例子中,我期望关闭套接字时得到的完成都是失败的?

我在我的博客上多谈这个问题。 这里: http : //www.lenholgate.com/blog/2008/07/write-completion-flow-control.html和在这里: http : //www.serverframework.com/asynchronousousevents/2011/06/tcp-flow-控制和异步writes.html