gpt4 book ai didi

c++ - 强制 WSARecv 重叠

转载 作者:行者123 更新时间:2023-11-28 07:45:37 25 4
gpt4 key购买 nike

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

如果我没理解错的话,这应该是我的设计:

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

在阅读了 WSARecv 之后(Here) ,我发现如果数据准备好,WSARecv 可能会立即返回数据。这看起来有点奇怪,因为这意味着如果客户端发送速度足够快 - 这可能会导致客户端饥饿......

特此我的问题是:

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

这就是我使用 WSARecv 的方式:

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

olStruct 是 OVERLAPPED 结构的扩展。

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

最佳答案

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

关于c++ - 强制 WSARecv 重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14937967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com