WSAEventSelect,一个事件,多个套接字
WSAEventSelect, one event, multiple sockets
我正在软件中重写代码以支持多个连接,直到现在,我使用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()
,并在任何给定套接字满足请求条件时通过窗口消息通知您。
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何在CPP中创建应该在Windows和Linux上运行的套接字?
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- (Winsock) UDP 接收工作正常,但同一套接字的发送失败
- Winsock2 select():同一个套接字上可能有多个事件吗?
- epoll_wait() 是否报告所有关闭的套接字事件
- c++套接字客户端在输出流关闭的情况下不断从Java服务器事件中接收一些内容
- WSAEventSelect,一个事件,多个套接字
- 如果客户端的互联网断开连接,客户端套接字不会关闭。如何在服务器中检测此事件?
- epoll_wait() 可以只用 1 个套接字和 1 个事件> 1 - EPOLLIN?
- 如何同时处理用户交互和套接字事件
- 基于套接字的事件循环
- poll() 似乎看不到 UDP 套接字上的事件
- C 套接字/轮询错误地返回 POLLOUT 事件