我有一个监听线程,等待使用select和FD_SET在几个套接字上读取。故事是。在某些时候,我将向池添加另一个套接字,并需要中止选择并重新初始化选择的FD_SET数组。我有一个事件来表示池的变化。但是select如何对我的事件作出反应? select()在这个时间点使用timeval,等待间隔为20秒,我不想把时间改为较低的值。我不希望经常通过超时重新启动select()...
有没有办法中止选择?什么是正确的方法来通知/重新启动选择并强制使用新的套接字列表(至少一个套接字将被添加到池中)
另一个问题--Msdn说“select函数确定一个或多个套接字的状态,必要时等待执行同步I / O.” 这是否意味着select不适用于使用异步操作转向使用的套接字?
答案 0 :(得分:4)
使用WSAEventSelect()
和WSAWaitForMultipleEvents()
代替select()
。这样,您的游泳池就可以使用WSACreateEvent()
制作单独的活动,并通过WSASetEvent()
发出信号,以便在需要时唤醒WSAWaitForMultipleEvents()
。
答案 1 :(得分:0)
如果要唤醒select(),最简单的方法是将一个字节发送到select()等待读取访问的其中一个套接字。在不影响现有套接字功能的情况下实现这一功能的一种方法是创建一对专门用于此目的的套接字,并将一个套接字连接到另一个套接字。