如何删除一个CLOSE_WAIT套接字连接(How do I remove a CLOSE_WAIT

2019-08-21 02:46发布

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

一旦程序意外终止,从此套接字连接显示在CLOSE_WAIT状态。 如果我尝试运行它挂起一个程序,我要迫使它结束时,其累积 CLOSE_WAIT套接字连接。

有没有办法冲洗这些连接?

Answer 1:

CLOSE_WAIT意味着你的程序还在运行,并没有关闭套接字(和内核正在等待它这样做)。 添加-pnetstat来获得PID,然后(与更有力地杀了它SIGKILL如果需要的话)。 这应该摆脱你的CLOSE_WAIT插座。 您还可以使用ps找到PID。

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



Answer 2:

如由克里斯特·克拉克 。

CLOSE_WAIT意味着连接的本地端已收到来自另一端的FIN,但操作系统在本端等待程序实际上关闭其连接。

问题是你的本地计算机上运行的程序没有关闭套接字。 它不是一个TCP调整的问题。 连接可以(而且相当正确地)留在CLOSE_WAIT永远,而程序保持开放的连接。

一旦本地程序关闭套接字,操作系统可以将FIN发送到转换你LAST_ACK,而你等待FIN的ACK远端。 一旦被接收,连接完成,并从连接表中删除(如果你到底是在CLOSE_WAIT你处于TIME_WAIT状态结束)。



Answer 3:

虽然太多CLOSE_WAIT连接的意思有什么错误,在你的第一个代码,这是不能接受的好的做法。

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

这是什么脚本是发出了连接在等待ACK。

这是对我工作。



Answer 4:

我也有一个非常最新的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`


Answer 5:

应当提及的是, Socket的两个客户端实例和服务器端需要显式调用close() 。 如果只有一个末端调用close()则太,插座将保持在CLOSE_WAIT状态。



文章来源: How do I remove a CLOSE_WAIT socket connection
标签: linux sockets