此article说明如下:
Windows事件机制(例如WaitForMultipleObjects())只能 一次等待64个事件对象。 Winsock 2提供了 WSAEventSelect()函数,它允许您使用Windows的事件机制 等待套接字上的事件。因为它使用Windows'事件 机制,你一次只能等待64个套接字上的事件。如果 你希望一次等待超过64个Winsock事件对象 需要使用多个线程,每个线程等待不超过64个 套接字。
这句话是否正确?我想要监视300个套接字以查看它们是否有要读取的待处理数据,那么我可以创建5个线程并使用WSAEventSelect()
来执行此操作吗?
答案 0 :(得分:1)
回答你的问题 - 是的,你引用的陈述是正确的。各种WaitFor
函数一次最多只能等待64个对象。因此,要同时等待300个套接字事件,您必须等待5个线程,其中4个线程正在等待64个事件,第5个线程正在等待44个事件。
如果要编写可伸缩套接字代码,则根本不应使用可等待的套接字事件。请改用I / O完成端口。您可以将多个套接字与单个IOCP句柄相关联,并且具有多个线程(最好是每个CPU核心一个)等待来自该单个IOCP的通知。使用支持IOCP的套接字函数(WSAConnect()
,WSAAcept()
,WSARead()
,WSASend()
等),让他们在完成工作时通知您。这允许您以最小的开销并行处理多个套接字。
有关详细信息,请参阅此文章:
Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports