我正在尝试实现使用IOCompletionPort从其客户端读取的服务器。
我有一些与this example非常相似的东西。
如果我正确理解,那应该是我的设计:
[主线程]创建一个监听套接字,绑定并监听
[主线程]创建事件,并使用WSAEventSelect将其附加到套接字接受信号
[接受线程]等待事件并接受客户端
[接受线程]客户端连接时,请使用CreateIOCompletionPort将IOCompletion队列与其一起使用
[接受线程]接受线程使用重叠参数调用第一个WSARecv
[工作线程]使用队列在WSARecv上实现领导者跟随模式
在阅读WSARecv之后(Here) ,我发现如果数据准备就绪,WSARecv可能会立即返回数据。这似乎有点奇怪,因为这意味着如果客户端快速发送,则工作人员可以在WSARecv上循环而无需返回IO队列足够-这可能会导致客户饥饿...
在此,我的问题是:
有没有办法“强制” WSARecv不立即返回?我是说要100%的时间返还IO_PENDING?
如果不是,针对扩展性进行了优化的正确设计是什么?
这就是我使用WSARecv的方式:
flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);
olStruct是OVERLAPPED结构的扩展。
编辑:
我最终使用PostQueuedCompletionStatus重新发布了从WSARecv获得的内容。我很想听听其他解决方案
查看答案
最佳答案
如果您将句柄与完成端口相关联,则WSARecv()
成功成功立即返回在语义上等效于WSARecv()
待处理成功返回,除非您具有:
如SetFileCompletionNotificationModes中所述,在成功时设置完成端口旁路,或者
您正在为hEvent成员提供有效的HANDLE并设置了一个位,如GetQueuedCompletionStatus中所述