我在C#中使用套接字(实际上是TcpListener和TcpClient)进行编程。我写了一个接受客户端连接并将数据流传输给它们的服务器。
为了测试可伸缩性,我编写了一个测试工具,它在一个循环中创建了一定数量的连接(比如1000),连接到服务器,并将收到的任何数据写入控制台。
服务器收到大约1300个连接后,客户端的连接尝试开始失败,并且常规“无法建立连接,因为目标计算机主动拒绝它”异常。如果客户端继续尝试,一些连接通过,但仍有许多连接没有。我甚至尝试过延迟,例如三个同时发生的客户端,每个客户端每秒打开一个连接到服务器,但问题仍然存在。
我的猜测是听力积压工作正在变满,但考虑到我推出的延迟,我现在对此表示怀疑。如何解释和解决这种行为?
编辑:在其他人跳过此问题并将其标记为重复而未阅读之前...
我使用Asynchronous Programming Model使用异步套接字。这是旧的BeginXXX / EndXXX模式,不是新的async / await模式。 APM使用下面的线程池,因此不是一个简单的单线程每连接模型。除非发生I / O,否则大多数时候连接处于休眠状态。在这种情况下,.NET Framework会自动分配线程来处理这个问题。
编辑2 :这个问题的要点,对于那些认为它也是[在这里插入愚蠢的形容词]的人来说,是:为什么服务器在负载很重的情况下会断开连接?我引用的错误消息通常发生在无法建立连接时(即当你的ip /端口出错时),但事实并非如此。