Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.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++_Windows_Sockets_Winapi - Fatal编程技术网

C++ WSAEventSelect()是否可以在多个线程中使用以增加套接字限制?

C++ WSAEventSelect()是否可以在多个线程中使用以增加套接字限制?,c++,windows,sockets,winapi,C++,Windows,Sockets,Winapi,这说明: Windows事件机制(例如WaitForMultipleObjects())只能 一次等待64个事件对象。Winsock 2提供了 WSAEventSelect()函数,该函数允许您使用Windows的事件机制 等待套接字上的事件。因为它使用Windows的事件 机制,一次只能等待64个套接字上的事件。如果 如果希望一次等待64个以上的Winsock事件对象,则 需要使用多个线程,每个线程最多只能等待64个线程 插座 这句话对吗?我想监视300个套接字,看看它们是否有待读取的挂起数据

这说明:

Windows事件机制(例如WaitForMultipleObjects())只能 一次等待64个事件对象。Winsock 2提供了 WSAEventSelect()函数,该函数允许您使用Windows的事件机制 等待套接字上的事件。因为它使用Windows的事件 机制,一次只能等待64个套接字上的事件。如果 如果希望一次等待64个以上的Winsock事件对象,则 需要使用多个线程,每个线程最多只能等待64个线程 插座


这句话对吗?我想监视300个套接字,看看它们是否有待读取的挂起数据,所以我可以创建5个线程,然后使用
WSAEventSelect()
来执行此操作吗?

回答您的问题-是的,您引用的语句是正确的。各种
WaitFor
函数一次最多只能等待64个对象。因此,要同时等待300个套接字事件,您必须等待5个线程,其中4个线程分别等待64个事件,第5个线程等待44个事件

如果您想编写可伸缩的套接字代码,那么根本不应该使用可等待的套接字事件。改用I/O完成端口。您可以将多个套接字与单个IOCP句柄相关联,并让多个线程(最好是每个CPU核心一个线程)等待来自该IOCP的通知。使用支持IOCP的套接字函数(
WSAConnect()
WSAAcept()
WSARead()
WSASend()
,等等),让它们在工作完成时通知您。这允许您以最小的开销并行处理多个套接字

有关更多详细信息,请参阅本文:


@IInspectable所以我的问题的答案是否定的,或者你的意思是IOCP是一种更好的方法?@joseph\m在我前面链接的问题上,它解释了如何绕过64套接字限制。对对象的单个调用仅限于
最大等待\u对象
对象。可扩展的网络应用程序通常使用编写。同一篇文章还讨论了
select()
WSAEventSelect()
相同(即,可以在多个线程中使用以增加套接字限制)。关于
select()
的这句话是否也正确?
select()
在不同的平台上有不同的限制,但在Windows上,
select()
默认一次限制为64个套接字。请参见
winsock.h
winsock2.h
中的
FD_SETSIZE
定义。但是,您可以手动将
FD_SETSIZE
重新定义为
#include
之前的其他值。但我不建议对大量套接字使用单个
select()
调用。如果你达到这个高度,你可能需要重写代码。