【发布时间】:2014-01-31 12:04:03
【问题描述】:
我最近用 C#(压力测试器)编写了一个程序,它创建了一个包含 100,000 个套接字的数组,并将每个套接字连接到指定的服务器。
每次我对此进行测试时,程序都会在 16,334 个套接字处停止。最后连接的套接字是套接字 16,334。在我关闭它们之前,它们都保持连接,但我仍然无法将超过 16,334 个套接字连接到同一台服务器。
为什么会这样?这是Winsock的限制吗?
如果是这样,是否可以通过某种方式绕过?
【问题讨论】:
-
我确定某处存在内部限制。 16,334 是“可疑接近” 16,383 (2^14-1) ..
-
@Tinwor "必须强调的是,将 FD_SETSIZE 定义为特定值对 Windows Sockets 服务提供商提供的实际套接字数量没有影响。该值仅影响select 和 WSAPoll 函数使用的 FD_XXX 宏。” - 我看到的与此类文档相关的所有此类资源都有“64”或“128”之类的值,与“16,334”(提供者限制?)相去甚远。
-
@Tinwor,你错了。它说可能的套接字数量取决于本地计算机上的内存量,但是当我将所有 16,334 个套接字连接到服务器时,CPU 和内存甚至没有接近 100%(所以这不是问题肯定是内存)。此外,问题是关于连接数而不是套接字数。我受到 16,334 个连接的限制,但我创建了 100,000 个套接字完全没有问题。
-
正如 user2864740 所暗示的,您的连接可能用完了可用的ephemeral ports。您也许可以通过打开一个连接来打开更多连接,同时从已注册的端口范围内明确指定一个端口号,但您需要注意不要受到网络设备的阻碍或干扰想要使用这些端口的其他服务。另外,我不确定服务器是否可以处理...
-
@elgonzo 好的,谢谢,但端口范围不是 0 到 65,535 吗?如果是这样,我不应该能够打开 65,536 个连接,而不仅仅是 16,334 个吗?
标签: c# sockets networking client