1

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

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

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

4

2 回答 2

5

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

于 2012-04-27T20:40:14.853 回答
0

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

于 2012-04-27T18:10:09.393 回答