我创建了一个服务器客户端(我创建了客户端,我的同事创建了另一种语言的服务器)应用程序。当我尝试将900多个客户端(所有单独的TCP客户端)连接到服务器时,我得到以下激励:
No connection could be made because the target computer actively refused it.
套接字错误:10061
WSAECONNREFUSED
连接被拒绝。无法建立连接,因为目标计算机主动拒绝它。这通常是因为尝试连接到外部主机上处于非活动状态的服务,即没有运行服务器应用程序的服务。
最终,如果我等待足够长时间,他们将在TCP套接字上连接(因为我们已经使自己重新连接/保持活动状态)。因此,如果失败,它将再次尝试直到成功。
我是否收到此错误,因为服务器已超载'并且不能同时处理所有请求(我在一个单独的线程中创建900个客户端,因此它几乎都试图同时连接)。
有没有办法对抗这种行为?我们可以调整TCP套接字选项,以便它可以同时处理更多客户端吗? 我也可能会注意到,我在同一台机器上运行服务器和客户端,在不同的机器上运行它似乎可以减少错误消息的数量。这就是为什么我认为这是某种容量问题,因为服务器无法快速处理它们。
答案 0 :(得分:1)
我是否收到此错误,因为服务器已超载'并且不能 一次处理所有请求(我每次创建900个客户端) 一个单独的线程,所以它几乎都试图连接 同时地)。
是的,这是疯了(创建900个单独的线程,你应该使用ConcurrentQueue
创建线程池并限制队列)!
您可以使用Socket.Listen(backlog);
增加积压数量,其中积压是挂起连接队列的最大长度。根据操作系统,backlog参数限制为不同的值。 您可以指定更高的值,但积压将根据操作系统进行限制。
有没有办法对抗这种行为?我们可以调整TCP套接字选项 所以它可以同时处理更多的客户?
不是这种情况(这里已经是900请求);但是,一般而言 - 是,在Socket.Listen(backlog)
中为积压较少的其他案例提供更多积压。此外,使用连接池(已由.NET运行时环境管理)和ConcurrentQueue按顺序处理线程。但是,请记住,您提供的积压数量不会超过受操作系统限制的数量。 900对于更简单的机器来说太过分了!
我也可能会注意到我正在运行服务器和客户端 在同一台机器上,在不同的机器上运行它似乎减少了 错误消息的数量。
它,因为负载已经分布在2台不同的机器上。但是,你仍然不应该尝试你正在做的事情。创建ConcurrentQueue来管理线程(按顺序)。