如何删除CLOSE_WAIT套接字连接

我写了一个小程序,与特定端口上的服务器进行交互。 该程序工作正常,但:

一旦程序意外终止,并从该套接字连接显示在CLOSE_WAIT状态。 如果我尝试运行一个程序,它会挂起,我必须强制它closures,这会累积更多的 CLOSE_WAIT套接字连接。

有没有办法刷新这些连接?

CLOSE_WAIT表示程序仍在运行,并没有closures套接字(内核正在等待它)。 将-p添加到netstat以获取pid,然后更有力地杀死它(如果需要,使用SIGKILL )。 这应该摆脱你的CLOSE_WAIT套接字。 您也可以使用ps来查找pid。

SO_REUSEADDR用于服务器和TIME_WAIT套接字,所以在这里不适用。

正如Crist Clark所描述的那样。

CLOSE_WAIT表示连接的本地端从另一端接收到一个FIN,但是OS正在等待本端的程序实际closures它的连接。

问题是在本地机器上运行的程序没有closures套接字。 这不是一个TCP调优问题。 在程序保持连接打开的情况下,连接可以(并且非常正确地)保持在CLOSE_WAIT中。

一旦本地程序closures套接字,操作系统就可以将FIN发送到远端,并在等待FIN的ACK时将其转换为LAST_ACK。 一旦收到,连接完成并从连接表中删除(如果您的结束处于CLOSE_WAIT中,则不会以TIME_WAIT状态结束)。

我也有一个最新的Tomcat服务器(7.0.40)相同的问题。 它几天没有响应一次。

要查看打开的连接,您可以使用:

 sudo netstat -tonp | grep jsvc | grep --regexp="127.0.0.1:443" --regexp="127.0.0.1:80" | grep CLOSE_WAIT 

如本文所述,您可以使用/proc/sys/net/ipv4/tcp_keepalive_time查看这些值。 该值似乎以秒为单位,默认为7200(即2小时)。

要改变它们,你需要编辑/etc/sysctl.conf

 Open/create `/etc/sysctl.conf` Add `net.ipv4.tcp_keepalive_time = 120` and save the file Invoke `sysctl -p /etc/sysctl.conf` Verify using `cat /proc/sys/net/ipv4/tcp_keepalive_time` 

即使过多的CLOSE_WAIT连接意味着你的代码在第一个有问题,这是不被接受的好习惯。

你可能想看看: https : //github.com/rghose/kill-close-wait-connections

这个脚本做的是发送连接正在等待的ACK。

这是为我工作。