可以在多个线程中使用WSAEventSelect()来增加套接字限制吗?

时间:2015-02-20 11:50:33

标签: c++ windows sockets winapi

article说明如下:

  

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

这句话是否正确?我想要监视300个套接字以查看它们是否有要读取的待处理数据,那么我可以创建5个线程并使用WSAEventSelect()来执行此操作吗?

1 个答案:

答案 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