-2

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

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

套接字错误:10061

WSACON拒绝

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

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

我是否收到此错误是因为服务器“超载”并且无法一次处理所有请求(我在一个单独的线程中创建了 900 个客户端,所以它几乎都在尝试同时连接)。

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

4

1 回答 1

1

我是否收到此错误是因为服务器“超载”并且无法一次处理所有请求(我在一个单独的线程中创建了 900 个客户端,所以它几乎都在尝试同时连接)。

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

您可以使用 增加积压的数量Socket.Listen(backlog);,其中积压是待处理连接队列的最大长度。backlog 参数被限制为不同的值,具体取决于操作系统。您可以指定更高的值,但积压将根据操作系统受到限制。

有没有办法应对这种情况?我们可以调整一个 TCP 套接字选项,以便它可以同时处理更多的客户端吗?

在这种情况下不是(这里已经是 900 个请求);但是,一般来说 -Socket.Listen(backlog)的,对于其他积压较少的情况,提供更多的积压。此外,使用连接池(已由 .NET 运行时环境管理)和 ConcurrentQueue 来按顺序处理线程。但是,请记住,您不能提供比 OS 限制的数量更多的 backlog。900 对于更简单的机器来说太多了!

还需要注意的是,我在同一台机器上运行服务器和客户端,在不同的机器上运行它似乎可以减少错误消息的数量。

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

于 2016-08-29T15:34:30.070 回答