【发布时间】:2015-05-21 04:46:59
【问题描述】:
我有一个服务器应用程序 (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 报告为“正在侦听”,但我无法连接到它。如果它可能是由编程错误引起的,那么什么样的错误会导致这种行为?
【问题讨论】:
-
也许有一个程序监听了这些端口但没有“清除”它们就关闭了?
-
看起来不可能。这是我自己的工作站。我总是运行这些类型的测试,并且从未在这台机器上看到使用相同端口的另一个应用程序。
-
然后检查可以使用这些端口的程序。你可以运行
ps ax | grep 2544 -
查看listen调用的backlog参数,应该是大了。或者您可能无法足够快地接受传入的连接...
-
@ForceBru 这是一台 Windows 机器。我用 netstat -a 检查过,没有其他程序在使用这个端口。