为什么服务器在客户端应用程序处于STOPPED状态后等待客户端?

这个问题是对此前提出的问题 的扩展

我用以下参数实现了jxh给出的解决方案 :

SO_KEEPALIVE = Enabled TCP_KEEPIDLE = 120 secs TCP_KEEPINTVL = 75 secs TCP_KEEPCNT = 1 

那为什么服务器仍然等待客户端响应?

我也在互联网上发现了这一点

kill 实际上将SIGTERM发送到给定进程。

所以我在“杀死”telnet应用程序后使用了ps -o pid,cmd,state命令。

我看到telnet进程仍然存在,但process state = T ,即它处于STOPPED状态

PS:我对Linux信号知之甚少,请考虑一下。

由于客户端进程仍处于活动状态,因此内核中的TCP堆栈将使用确认数据包将其接收的保持活动数据包处理回数据包的发送方。 因此,即使连接确实处于空闲状态,连接也永远不会关闭,因为内核正在愉快地处理数据包。

在真实网络上,根据您的参数,如果来自客户端计算机的ACK丢失,则将关闭连接。 在您的设置中,由于客户端和服务器位于同一台计算机上,因此您的网络基本上是无损的。

我不清楚你是如何在这种状态下获得telnet会话的。 SIGTERM不会将进程置于停止状态。 当接收SIGSTOP (通常是SIGTSTP ,但似乎telnet忽略那个)时,进程进入停止状态。 我建议您可能错误地发送了该信号,或者您暂停了会话(使用^]z )。 当发生这种情况时,您应该已经在窗口中看到了具有您的telnet会话的那个,生成如下输出:

 [1]+ Stopped telnet ... 

这是由shell打印的。 当telnet进程停止时,它将不会处理SIGTERM直到它被置于前台。

将立即处理SIGKILL (使用kill -9 )。

因为客户端尚未退出,仍处于STOPPED状态,因此也没有关闭其连接。