Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WSAEventSelect,一个事件,多个套接字_C++_Sockets_Winapi - Fatal编程技术网

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

C++ WSAEventSelect,一个事件,多个套接字,c++,sockets,winapi,C++,Sockets,Winapi,我在我的软件中重写代码以支持多个连接,直到现在,我都使用select。为了使我的软件更具可移植性,我改为WSAPoll。在WSAPoll中发现Microsoft无法解决的错误后,我想更改为建议的WSAEventSelect。由于WSAWaitForMultipleEvents最多只支持64个事件,并且出于节省资源的原因,我想将一个hEvent连接到多个套接字。我现在的问题是,是吗 rc = WSAEventSelect(s1, hEventObject1, FD_READ); rc = WSAE

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

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

合法的手术?如果你有确凿的事实,而不是观点,请回答。或者你以前也用过这种方式。此外,出于某些原因,我不想使用boost(例如,1.52在套接字部分有一个bug(有趣的是,它几乎与WSAPoll相同)。另外,请不要“Why't you…”

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

要绕过64个句柄限制,请执行
WaitForMultipleObjects()
文档中所述的操作:

要等待多个最大\u wait\u对象句柄,请使用以下方法之一:

•创建一个线程以等待最大的对象句柄,然后再等待该线程和其他句柄。使用此技术可以将控制柄拆分为最大\u等待\u对象组

•调用RegisterWaitForSingleObject等待每个句柄。线程池中的等待线程等待已注册对象的最大\u wait\u对象,并在对象发出信号或超时间隔过期后分配工作线程


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

硬事实:如果设置一对多映射,您将失去唯一标识对象的能力。我想知道你希望用你问题中的代码片段实现什么。@I不可测当然你是对的。我必须用WSAEnumNetworkEvents遍历所有套接字,即使它们不发出任何信号。我只是试着把事情保持在一个线程中,因为我重构的其余代码目前不是线程安全的。我建议另一种选择,即使用IO完成端口。它们有点痛苦,但是允许你在一个对象上等待,而不会失去区分套接字的能力。我知道这一点。这是一种黑客行为,将单线程作为我必须使用的代码的一部分不是线程安全的(目前)。我接受损失,并使用WSAEventSelect遍历套接字。这比建立一种队列系统更容易,这种系统最终会产生相同的效果。像这样,我知道这是一种特殊的方式。不幸的是,microsoft帮助中没有描述这种方法。@Hasturkun是的,但我没有找到一个包含多个套接字的简单教程。我读到的有关IO完成端口的内容看起来非常复杂。对于linux/Mac OS,poll()非常简单。我不想学习下一个微软自己的做事方式,所以我试图接近我现在已经拥有的东西,WSA的东西。@MartinSchlott:I/O完成端口不是新的,它们已经存在很长时间了,在2.0首次发布时被添加到WinSock中。有关详细信息,请参阅MSDN:。您可以将多个套接字与单个IOCP关联,并且无论何时发出信号,您都可以使用用户定义的上下文信息来知道每次触发哪个套接字。@MartinSchlott:您不需要(但应该)将工作线程与IOCP关联,您可以使用
GetQueuedCompletionStatus()轮询IOCP状态信息
在管理套接字的同一线程中。