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

WSAEventSelect, one event, multiple sockets

本文关键字:事件 套接字 一个 WSAEventSelect      更新时间:2023-10-16

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

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

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

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

要绕过 64 句柄的限制,请按照WaitForMultipleObjects()文档所说的操作:

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

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

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

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