无法再连接到进程仍在侦听的本地端口

Cannot connect to a local port anymore that is still being listened by a process

我有一个服务器应用程序 (unimrcpserver.exe) 正在响应来自客户端进程的请求。该服务器进程侦听多个端口。 使用 netstat -a 命令,我的流程得到以下几行。

  TCP    192.168.10.65:2544     MERTB-PC:0             LISTENING  
  TCP    192.168.10.65:2554     MERTB-PC:0             LISTENING  
  TCP    192.168.10.65:9060     MERTB-PC:0             LISTENING  

(netstat 输出很长我只把相关行放在这里)

通常当系统工作时,我从这些端口向服务器发出请求,每个端口都工作正常。

在做压力测试的时候,我看到系统不再响应我通过端口 2554 发出的请求的情况。 netstat -a 仍然给我上面的行,所以服务器仍然以某种方式监听这个端口。当我在同一台机器上 运行 telnet 时出现错误:

telnet 192.168.10.65 2554  
  Connecting To 192.168.10.65...Could not open connection to the host, on port 2554: Connect failed

我还用 C++ 编写了一个简单的程序来获取系统为 connect() 请求生成的确切错误消息。这次我收到以下错误:

No connection could be made because the target machine actively refused it

附加信息:一切都在同一台 Windows 机器上。防火墙被禁用。这种情况只在我做同时发送多个请求的压力测试时出现过一次。在这种情况发生之前,系统处理了大约 13000 个请求,耗时大约半小时。

那么问题来了:怎么会出现这种情况呢?使用 netstat 将端口报告为 "LISTENING",但我无法连接到它。如果它可能是由编程错误引起的,那么什么样的错误会导致这种行为?

So the question is : How can this situation occur? The port is being reported >>as "LISTENING" with netstat but I cannot connect to it. If it can be caused >>by a programming error what kind of an error can cause this kind of behavior?

是的,这可能是服务器上的编程错误引起的。当服务器的侦听线程死锁时,我已经看到它发生了。套接字的状态是 "listening" 但是如果侦听线程有一些全局状态并且被其他等待释放互斥锁的线程阻塞,你会遇到这种情况。 此外,就像这里的其他人所说的那样,如果 CPU 由于压力测试而加载,这可能会导致服务器拒绝连接,因为线程可能正忙于处理,而侦听线程永远没有机会接受连接。

新连接可以 "actively refused" 在几种情况下:

  1. 正在连接的 IP:Port 上没有 LISTENING 套接字。

  2. 有一个LISTENING套接字,但是它的待处理连接积压已满,所以此时它无法接受新连接。

  3. 防火墙阻止了它。虽然防火墙更有可能使用不同的错误,如果它发送错误的话。

由于有一个LISTENING套接字,#2是最likely/common的情况。如果是这样,这意味着服务器应用程序没有足够快地接受其积压的客户端,如果有的话。

客户无法区分这些情况。它所能做的就是检测连接失败 - WSAECONNREFUSEDECONNREFUSED,具体取决于平台 - 稍后再试。