【问题标题】:Forcing WSARecv to overlap强制 WSARecv 重叠
【发布时间】:2013-02-18 13:54:37
【问题描述】:

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

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

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

在阅读了 WSARecv (Here) 我发现如果数据准备好,WSARecv 可能会立即返回数据。这看起来有点奇怪,因为这意味着如果工作人员可以在 WSARecv 上循环而不返回 IO 队列,如果客户端发送速度足够快 - 这可能导致客户端饥饿...

我的问题是:

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

这就是我使用 WSARecv 的方式:

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

olStruct 是 OVERLAPPED 结构的扩展。

编辑: 我最终使用 PostQueuedCompletionStatus 重新发布了从 WSARecv 获得的内容。不过我很想听听其他解决方案 查看答案

【问题讨论】:

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


    【解决方案1】:

    如果您已将句柄与完成端口相关联,则WSARecv() 立即成功返回在语义上等同于WSARecv() 返回未决,除非您有:

    【讨论】:

      【解决方案2】:

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

      所以目前的设计仍然有效。

      【讨论】:

        猜你喜欢
        • 2022-10-24
        • 2015-06-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 2015-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多