1

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

rc = WSAEventSelect(s1, hEventObject1, FD_READ);
rc = WSAEventSelect(s2, hEventObject1, FD_READ);

合法的操作?请仅在您有确凿的事实而不是意见的情况下回答。或者你自己以前用过这种方式。另外,出于某些原因,我不想使用 boost(例如 1.52 在套接字部分有一个错误(有趣的是,这与 WSAPoll 几乎相同的错误))。也请不要“你为什么不……”

4

1 回答 1

2

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

要绕过 64 个句柄的限制,请按照WaitForMultipleObjects()文档中的说明执行操作:

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

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

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

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

于 2013-11-12T18:06:44.043 回答