WSAEventSelect,一个事件,多个套接字

时间:2013-11-12 17:38:51

标签: c++ sockets winapi

我在我的软件中重写代码以支持多个连接,直到现在,我使用select。为了让我的软件更具可移植性,我改为WSAPoll。在找到微软无法解决的WSAPoll中的错误后,我想更改为建议的WSAEventSelect。由于WSAWaitForMultipleEvents仅支持最多64个事件并且出于资源节省的原因,我想将hEvent连接到多个套接字。我现在的问题是,是

rc = WSAEventSelect(s1, hEventObject1, FD_READ);
rc = WSAEventSelect(s2, hEventObject1, FD_READ);
合法的操作?只有你有事实,而不是意见,请回答。或者你以前用过这种方式。另外,我不想出于某些原因使用boost(例如,1.52在套接字部分有一个错误(有趣的是与WSAPoll几乎相同))。也请不要“你为什么不......”

1 个答案:

答案 0 :(得分:2)

单个等待事件不应与多个套接字关联。每个套接字应该使用它自己的单独事件。否则,如果多个套接字要使用相同的事件,则在发出该事件信号时,您将不知道哪个套接字满足等待。即使你可以,当调用WSAEnumNetworkEvents()来获取事件数据时也会出现竞争条件,因为它会重置事件,该事件可能已由另一个套接字设置。所以你可能会失去一些事件。

要解决64个句柄的限制,请执行WaitForMultipleObjects()文档要执行的操作:

  

要等待超过MAXIMUM_WAIT_OBJECTS句柄,请使用以下方法之一:

     

•创建一个线程以等待MAXIMUM_WAIT_OBJECTS句柄,然后等待该线程加上其他句柄。使用此技术将句柄分成MAXIMUM_WAIT_OBJECTS组。

     

•调用RegisterWaitForSingleObject在每个句柄上等待。来自线程池的等待线程在MAXIMUM_WAIT_OBJECTS注册的对象上等待,并在发出对象信号或超时间隔到期后分配工作线程。

否则,请改用WSAAsyncSelect(),并在任何给定套接字满足请求条件时通过窗口消息通知您。