可以在多线程中使用 WSAEventSelect() 来增加套接字限制吗?
Can WSAEventSelect() be used in multiple threads to increase sockets limit?
这个 article 说了以下内容:
The Windows event mechanism (e.g. WaitForMultipleObjects()) can only
wait on 64 event objects at a time. Winsock 2 provides the
WSAEventSelect() function which lets you use Windows’ event mechanism
to wait for events on sockets. Because it uses Windows’ event
mechanism, you can only wait for events on 64 sockets at a time. If
you want to wait on more than 64 Winsock event objects at a time, you
need to use multiple threads, each waiting on no more than 64 of the
sockets.
这个说法正确吗?我想监控 300 个套接字,看看它们是否有待读取的数据,那么我可以只创建 5 个线程并使用 WSAEventSelect()
来做到这一点吗?
回答你的问题——是的,你引用的说法是正确的。各种 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
这个 article 说了以下内容:
The Windows event mechanism (e.g. WaitForMultipleObjects()) can only wait on 64 event objects at a time. Winsock 2 provides the WSAEventSelect() function which lets you use Windows’ event mechanism to wait for events on sockets. Because it uses Windows’ event mechanism, you can only wait for events on 64 sockets at a time. If you want to wait on more than 64 Winsock event objects at a time, you need to use multiple threads, each waiting on no more than 64 of the sockets.
这个说法正确吗?我想监控 300 个套接字,看看它们是否有待读取的数据,那么我可以只创建 5 个线程并使用 WSAEventSelect()
来做到这一点吗?
回答你的问题——是的,你引用的说法是正确的。各种 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