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

标签 c++ windows sockets winapi

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

关于c++ - 可以在多线程中使用 WSAEventSelect() 来增加套接字限制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28628303/

相关文章:

c++ - 模板化基类成员的 g++ 编译器错误

android - TCP套接字从PC传输数据到android设备(Android NDK)

c++ - 将 Web 应用程序作为资源嵌入到 C++ Qt 可执行文件中

c++ - std::mutex 线程间同步

c++ - OS X 程序集中的 Zerofill 大小溢出

PHP Rename() 删除 Windows 中的所有者属性?

即使使用 Magic Comment,Ruby UTF-8 编码也无法在 Windows 中工作

c++ - 使用 MinGW 检查 Boost 安装

java - JFrame 未正确加载

c - Linux UDP 接收 : What do I get at the start of my buffer?