尝试一次将几百个客户端连接到单个服务器的错误消息(套接字错误10061)

时间:2016-08-29 14:58:03

标签: c# sockets tcp network-programming connection-refused

我创建了一个服务器客户端(我创建了客户端,我的同事创建了另一种语言的服务器)应用程序。当我尝试将900多个客户端(所有单独的TCP客户端)连接到服务器时,我得到以下激励:

No connection could be made because the target computer actively refused it.
  

套接字错误:10061

     

WSAECONNREFUSED

     

连接被拒绝。无法建立连接,因为目标计算机主动拒绝它。这通常是因为尝试连接到外部主机上处于非活动状态的服务,即没有运行服务器应用程序的服务。

最终,如果我等待足够长时间,他们将在TCP套接字上连接(因为我们已经使自己重新连接/保持活动状态)。因此,如果失败,它将再次尝试直到成功。

我是否收到此错误,因为服务器已超载'并且不能同时处理所有请求(我在一个单独的线程中创建900个客户端,因此它几乎都试图同时连接)。

有没有办法对抗这种行为?我们可以调整TCP套接字选项,以便它可以同时处理更多客户端吗? 我也可能会注意到,我在同一台机器上运行服务器和客户端,在不同的机器上运行它似乎可以减少错误消息的数量。这就是为什么我认为这是某种容量问题,因为服务器无法快速处理它们。

1 个答案:

答案 0 :(得分:1)

  

我是否收到此错误,因为服务器已超载'并且不能   一次处理所有请求(我每次创建900个客户端)   一个单独的线程,所以它几乎都试图连接   同时地)。

是的,这是疯了(创建900个单独的线程,你应该使用ConcurrentQueue创建线程池并限制队列)!

您可以使用Socket.Listen(backlog);增加积压数量,其中积压是挂起连接队列的最大长度。根据操作系统,backlog参数限制为不同的值。 您可以指定更高的值,但积压将根据操作系统进行限制。

  

有没有办法对抗这种行为?我们可以调整TCP套接字选项   所以它可以同时处理更多的客户?

不是这种情况(这里已经是900请求);但是,一般而言 - ,在Socket.Listen(backlog)中为积压较少的其他案例提供更多积压。此外,使用连接池(已由.NET运行时环境管理)和ConcurrentQueue按顺序处理线程。但是,请记住,您提供的积压数量不会超过受操作系统限制的数量。 900对于更简单的机器来说太过分了!

  

我也可能会注意到我正在运行服务器和客户端   在同一台机器上,在不同的机器上运行它似乎减少了   错误消息的数量。

它,因为负载已经分布在2台不同的机器上。但是,你仍然不应该尝试你正在做的事情。创建ConcurrentQueue来管理线程(按顺序)。