强制WSARecv重叠

时间:2013-02-18 13:54:37

标签: c++ winapi overlap winsock2 io-completion-ports

我正在试图实现一个使用IOCompletionPort从其客户端读取的服务器。 我有一些与this example非常相似的东西。

如果我理解正确,这应该是我的设计:

  1. [主线程]创建一个侦听套接字,绑定并监听
  2. [主线程]使用WSAEventSelect
  3. 创建一个事件并将其附加到套接字接受信号
  4. [接受主题]等待活动并接受客户
  5. [接受线程]当客户端连接时,使用CreateIOCompletionPort将IOCompletion队列与其一起使用
  6. [Accept Thread] accept线程调用带有重叠参数的第一个WSARecv
  7. [工作线程]使用队列在WSARecv
  8. 上实现领导者跟随者模式

    在对WSARecv(Here) 进行一些阅读之后,我发现如果数据准备就绪,WSARecv可能会立即返回数据。这看起来有点奇怪,因为这意味着工作人员可以在不返回IO队列的情况下循环WSARecv如果客户端发送得足够快 - 这可能导致客户端饥饿......

    我的问题是:

    1. 有没有办法“强迫”WSARecv不立即返回?我的意思是,100%的时间返回IO_PENDING?
    2. 如果没有 - 什么是正确的设计,针对可扩展性进行了优化?
    3. 这就是我使用WSARecv的方式:

      flags = 0;
      receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);
      

      olStruct是OVERLAPPED结构的扩展。

      <击>编辑: 我最后使用PostQueuedCompletionStatus重新发布了我从WSARecv获得的内容。我很想听听其他解决方案 见答案

2 个答案:

答案 0 :(得分:1)

如果您已将句柄与完成端口关联,则WSARecv()立即返回成功在语义上相当于您WSARecv()返回待处理,除非您有:< / p>

答案 1 :(得分:0)

似乎当WSARecv立即完成时,它返回缓冲区并发布到IOCompletionPort队列。

所以目前的设计仍然存在。