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