【问题标题】:C++ Win async sockets. Is it possible to interrupt select()C++ Win 异步套接字。是否可以中断 select()
【发布时间】:2012-04-27 15:00:34
【问题描述】:

我有一个正在等待使用 select 和 FD_SET 在几个套接字上读取的侦听线程。故事是。在某个时候,我将向池中添加另一个套接字,并且需要中止选择并重新初始化选择的 FD_SET 数组。我有一个事件来表示池更改。但是 select 如何对我的事件做出反应? select() 此时使用 timeval 等待间隔为 20 秒,我不想将时间更改为较低的值。我不想经常在超时后重新启动 select()...

有什么方法可以中止选择吗?通知/重新启动选择和强制使用新的套接字列表的正确方法是什么(至少一个套接字将被添加到池中)

还有一个问题——Msdn 说“select 函数确定一个或多个套接字的状态,必要时等待,以执行同步 I/O。” 这是否意味着 select 不适用于转而使用异步操作的套接字?

【问题讨论】:

  • 如何使套接字异步?哪个api?
  • @johnathon:套接字在 Windows 上默认支持异步(重叠)I/O,除非您使用 WSASocket() 调用禁用它。
  • @AndréCaron 是否愿意向我指出一些支持这一点的文档?正如我的印象(以及我的参考来自 bob quinn 和 dave shute),所有创建的套接字都是阻塞的.. 除非您稍后(在创建后)另外指定。
  • @johnathon:您混淆了阻塞/非阻塞和异步 I/O。来自WSASelect() 上的文档:“默认情况下,使用WSASocket() 函数创建的套接字不会设置此重叠属性。相反,socket() 函数创建一个默认支持重叠 I/O 操作的套接字行为。”
  • 默认创建为阻塞的套接字。我使用 ioctlsocket 将它们设置为异步模式。

标签: c++ windows sockets events


【解决方案1】:

使用WSAEventSelect()WSAWaitForMultipleEvents() 而不是select()。这样,您的池可以使用 WSACreateEvent() 创建一个单独的事件,并使用 WSASetEvent() 发出信号,以便在需要时唤醒 WSAWaitForMultipleEvents()

【讨论】:

  • 这是正确的。 +1。只需要添加事件数组(每个套接字),难题就解决了。
【解决方案2】:

如果您希望 select() 唤醒,最简单的方法是将一个字节发送到 select() 正在等待读取访问的套接字之一。在不影响现有套接字功能的情况下实现这一点的一种方法是创建一对专门用于该目的的套接字,然后相互连接()。

【讨论】:

  • 实现者注意:由于Windows上没有socketpair(),这实际上需要放弃一些工作,以及为额外的“控制”套接字使用额外的端口。
  • 我的想法是有额外的套接字来唤醒选择。我只是不相信这是唯一的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 2011-10-06
  • 2019-04-27
相关资源
最近更新 更多