【发布时间】: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