我已经写了一个小程序,在指定的端口上的服务器进行交互。 该程序工作正常,但:
一旦程序意外终止,从此套接字连接显示在CLOSE_WAIT
状态。 如果我尝试运行它挂起一个程序,我要迫使它结束时,其累积更 CLOSE_WAIT
套接字连接。
有没有办法冲洗这些连接?
我已经写了一个小程序,在指定的端口上的服务器进行交互。 该程序工作正常,但:
一旦程序意外终止,从此套接字连接显示在CLOSE_WAIT
状态。 如果我尝试运行它挂起一个程序,我要迫使它结束时,其累积更 CLOSE_WAIT
套接字连接。
有没有办法冲洗这些连接?
CLOSE_WAIT
意味着你的程序还在运行,并没有关闭套接字(和内核正在等待它这样做)。 添加-p
来netstat
来获得PID,然后(与更有力地杀了它SIGKILL
如果需要的话)。 这应该摆脱你的CLOSE_WAIT
插座。 您还可以使用ps
找到PID。
SO_REUSEADDR
是服务器和TIME_WAIT
套接字,所以在这里不适用。
如由克里斯特·克拉克 。
CLOSE_WAIT意味着连接的本地端已收到来自另一端的FIN,但操作系统在本端等待程序实际上关闭其连接。
问题是你的本地计算机上运行的程序没有关闭套接字。 它不是一个TCP调整的问题。 连接可以(而且相当正确地)留在CLOSE_WAIT永远,而程序保持开放的连接。
一旦本地程序关闭套接字,操作系统可以将FIN发送到转换你LAST_ACK,而你等待FIN的ACK远端。 一旦被接收,连接完成,并从连接表中删除(如果你到底是在CLOSE_WAIT你不处于TIME_WAIT状态结束)。
虽然太多CLOSE_WAIT连接的意思有什么错误,在你的第一个代码,这是不能接受的好的做法。
你可能想看看: https://github.com/rghose/kill-close-wait-connections
这是什么脚本是发出了连接在等待ACK。
这是对我工作。
我也有一个非常最新的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`
应当提及的是, Socket
的两个客户端实例和服务器端需要显式调用close()
。 如果只有一个末端调用close()
则太,插座将保持在CLOSE_WAIT状态。