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

本文关键字:错误 单个 连接 服务器 消息 客户端 10061 套接字 一次 百个 | 更新日期: 2023-09-27 18:04:29

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

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

Socket错误:10061

WSAECONNREFUSED

连接拒绝了。由于目标计算机主动拒绝连接,无法建立连接。这通常是由于试图连接到外部主机上不活动的服务(即没有运行服务器应用程序的服务)而导致的。

最后,如果我等待的时间足够长,它们都将在TCP套接字上连接(因为我们已经创建了自己的reconnect/keep alive)。因此,如果失败,它将简单地再次尝试,直到成功。

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

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

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

我得到这个错误,因为服务器是"超载",不能处理所有的请求一次(我创建900个客户端每个在一个单独的线程,所以它几乎都在尝试连接同时)。

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

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

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

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

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

会的,因为负载分布在两台不同的机器上。但是,你还是不应该尝试你正在做的事情。创建一个ConcurrentQueue来管理线程(按顺序)