gpt4 book ai didi

windows - 没有 ConnectEx 的 Windows 上的非阻塞套接字连接

转载 作者:可可西里 更新时间:2023-11-01 11:37:24 29 4
gpt4 key购买 nike

我需要在单个进程中启动 1000 个客户端 连接,我需要解决的关键限制是驱动程序不支持 ConnectEx,因此我无法拥有纯 IOCP 解决方案。

我的第一个想法是一个线程池来处理连接,其中每个句柄可以使用普通连接/选择语义处理多达 64 个连接,并且一旦连接就继续使用 IOCP。但这行不通;一旦选择运行,我就不能向 FD_SET 添加另一个套接字。所以我必须将套接字设置为非阻塞并轮询它们。
最好的解决方案可能是最简单的;每个线程一个连接客户端。假设我可以保持合理的连接速率,池中的线程数可能会很小。

这是一个奇怪的情况,理想情况下,驱动程序会支持 ConnectEx,但它(目前)不支持,我需要以尽可能最好的方式解决它。

还有别的办法吗?

最佳答案

首先,可以使用虚拟套接字(例如连接到自身的 UDP 套接字)来破坏 select,尽管在​​您的情况下这可能代价高昂。

如果你有一个可以处理消息的窗口,你可以使用WSAAsyncSelect获取 connect 的异步通知。 (请注意,这也会自动使您的套接字成为非阻塞状态,这需要再次调用 WSAAsyncSelect 并调用 ioctlsocket 来禁用)。

如果没有,您可以使用 WSAEventSelect ,尽管您会发现这将您限制为每次等待 64 个套接字(因为这是 WaitForMultipleObjects 的上限)。这也将使您的套接字成为非阻塞的,您可以像为 WSAAsyncSelect 所做的那样撤消它。

(作为完整的旁注,您可以通过在包含 winsock2.h 之前定义 FD_SETSIZE 来增加 select 处理的套接字数量)

关于windows - 没有 ConnectEx 的 Windows 上的非阻塞套接字连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866485/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com