背景:我正在使用 CreateIoCompletionPort、WSASend/Recv 和 GetQueuedCompletionStatus 在我的服务器上执行重叠套接字 io。对于流控制,当发送到客户端时,我只允许在所有挂起的 OVERLAP 都从 IOCP 弹出时调用几个 WSASend()。
问题:最近,有一些情况是 OVERLAP 没有返回到 IOCP。调用 GetQueuedCompletionStatus 的线程没有得到它们,它们保留在我的本地挂起队列中。我已经验证客户端确实从套接字接收数据并且套接字已连接。进行 WSASend() 调用时没有返回错误。没有外部刺激,重叠只是“永远不会”回来,如下所示:
- 从客户端或服务器断开套接字,立即允许 GetQueuedCompletionStatus 线程检索 OVERLAP
- 在所有 OVERLAP 突然从队列中弹出之前,有时需要多次调用 WSASend()。
问题:有人见过这种行为吗?关于造成这种情况的任何想法?
谢谢,杰弗里