gpt4 book ai didi

c++ - WSAEventSelect,一个事件,多个套接字

转载 作者:行者123 更新时间:2023-11-30 04:12:07 24 4
gpt4 key购买 nike

我正在重写我的软件中的代码以支持多个连接,直到现在,我都使用 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() 文档中所说的操作:

To wait on more than MAXIMUM_WAIT_OBJECTS handles, use one of the following methods:

• Create a thread to wait on MAXIMUM_WAIT_OBJECTS handles, then wait on that thread plus the other handles. Use this technique to break the handles into groups of MAXIMUM_WAIT_OBJECTS.

• Call RegisterWaitForSingleObject to wait on each handle. A wait thread from the thread pool waits on MAXIMUM_WAIT_OBJECTS registered objects and assigns a worker thread after the object is signaled or the time-out interval expires.

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

关于c++ - WSAEventSelect,一个事件,多个套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19936131/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com