c++ - 无法再连接到进程仍在监听的本地端口

标签 c++ sockets tcp

我有一个服务器应用程序 (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”,但我无法连接到它。如果它可能是由编程错误引起的,那么什么样的错误会导致这种行为?

最佳答案

在几种情况下可以“主动拒绝”新连接:

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

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

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

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

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

关于c++ - 无法再连接到进程仍在监听的本地端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29121414/

相关文章:

c++ - 使用 lua_pcall 调用的 lua 函数丢失的错误消息

c++ - 使用waf时如何组织测试资源文件

delphi - 来自 TCustomWinSocket 的 ReceiveBuf 不适用于缓冲区的动态数组

java - 如何使用 TCP 连接同时接受多个客户端?

javascript - XMLHttpRequest 中 TCP 握手究竟何时发生?

c++ - Wincrypt : Unable to decrypt file which was encrypted in C#. NTE_BAD_DATA 在 CryptDecrypt

c++ - 使用 std::function 在使用模板时调用成员函数

linux - 如何在Perl上创建持久套接字连接?

tcp - 服务器收到客户端的SYN后立即发送SYN/ACK

api - 指纹通过 Get/Post 方法连接到 Web Server