我正在试图实现一个使用IOCompletionPort从其客户端读取的服务器。 我有一些与this example非常相似的东西。
如果我理解正确,这应该是我的设计:
在对WSARecv(Here) 进行一些阅读之后,我发现如果数据准备就绪,WSARecv可能会立即返回数据。这看起来有点奇怪,因为这意味着工作人员可以在不返回IO队列的情况下循环WSARecv如果客户端发送得足够快 - 这可能导致客户端饥饿......
我的问题是:
这就是我使用WSARecv的方式:
flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);
olStruct是OVERLAPPED结构的扩展。
<击>编辑: 我最后使用PostQueuedCompletionStatus重新发布了我从WSARecv获得的内容。我很想听听其他解决方案 见答案
答案 0 :(得分:1)
如果您已将句柄与完成端口关联,则WSARecv()
立即返回成功在语义上相当于您WSARecv()
返回待处理,除非您有:< / p>
答案 1 :(得分:0)
似乎当WSARecv立即完成时,它返回缓冲区并发布到IOCompletionPort队列。
所以目前的设计仍然存在。