一些重叠使用WSASend使用GetQueuedCompletionStatus时不及时回来?(so

2019-07-30 09:46发布

背景:我使用CreateIoCompletionPort,WSASend / RECV和GetQueuedCompletionStatus时做我的服务器上重叠的套接字IO。 对于流控制,发送到客户端时,我只允许几个WSASend()时,所有待处理的重叠都弹出了IOCP被调用。

问题:最近,有当重叠没有得到恢复到IOCP occassions。 该线程调用GetQueuedCompletionStatus时没有得到他们,他们留在我的本地等待队列。 我已经验证该客户机接收数据关闭插座和插座连接。 当WSASend()调用作了不返回任何错误。 的重叠仅仅是“从来没有”回来没有外部刺激像下面这样:

  1. 断开客户机或服务器的插座,立即允许GetQueuedCompletionStatus时线程来检索重叠
  2. 制作额外调用WSASend(),有时几个需要,之前所有的重叠突然蹦出从队列中。

问:有没有人见过这种类型的行为? 是什么原因造成这种任何想法?

谢谢,杰弗里

Answer 1:

WSASend()可能会失败,如果TCP窗口完全完成及时。 在这种情况下让你的堆栈无法发送任何数据WSASend()等待你的完成并不发生,直到TCP堆栈可以发送更多的数据。

如果你碰巧有您的客户端和服务器之间的协议,该协议具有内置到协议本身没有流量控制和你没有做任何自己的流量控制基础上写完井和只是发送数据的速度为您的服务器可以发送,那么你可能会到一个地步,网络或您的客户端无法跟上和TCP流控制踢(当TCP窗口已满)。 如果继续只火了数据不同步与另外的电话WSASend()那么最终你会在所有机器上的非分页内存,并在这一点,所有的赌注都关闭咀嚼你的方式(几率很高,一个司机可能导致框蓝屏)。

所以,综上所述,从重叠的套接字完井写入即可,有时会需要更长的时间回来可能比你期望的那样。 在你的榜样,我希望,当你关闭套接字,你得到的落成都失败?

我说说这一些在我的博客; 在这里: http://www.lenholgate.com/blog/2008/07/write-completion-flow-control.html这里: http://www.serverframework.com/asynchronousevents/2011/06/tcp-flow-控制和异步writes.html



文章来源: some OVERLAPS using WSASend not returning in a timely manner using GetQueuedCompletionStatus?
标签: c++ windows iocp