我有一个服务器应用程序 (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”,但我无法连接到它。如果它可能是由编程错误引起的,那么什么样的错误会导致这种行为?
最佳答案
在几种情况下可以“主动拒绝”新连接:
正在连接的 IP:Port 上没有
LISTENING
套接字。有一个
LISTENING
套接字,但是它积压的待处理连接已满,因此此时它无法接受新连接。防火墙阻止了它。虽然防火墙更有可能使用不同的错误,但如果它发送错误的话。
因为有一个LISTENING
套接字,#2 是最有可能/常见的情况。如果是这样,这意味着服务器应用程序没有足够快地接受其积压的客户端,如果有的话。
客户端无法区分这些条件。它所能做的就是检测连接失败 - WSAECONNREFUSED
或 ECONNREFUSED
,具体取决于平台 - 并稍后重试。
关于c++ - 无法再连接到进程仍在监听的本地端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29121414/