当前位置: 技术问答>linux和unix
LINUX AS3.0想不通的TCP链接问题
来源: 互联网 发布时间:2015-11-28
本文导语: c/s TCP服务,一端应用停掉,乃至机器重启动,但是另一端用netstat仍能看到链路存在,郁闷死,在网上搜了好久,没有看到有人提及这个问题。 | 对服务器断电或网线断掉这样的事情,通常就...
c/s TCP服务,一端应用停掉,乃至机器重启动,但是另一端用netstat仍能看到链路存在,郁闷死,在网上搜了好久,没有看到有人提及这个问题。
|
对服务器断电或网线断掉这样的事情,通常就只有主动检测了。比如在程序中创建一个状态报告线程,负责向客户端传递信息,相当于一个心跳。
对于tcp,有一个KeepAlive选项,可以让服务器主动定期地发送探测报文,这样就能发现对方的socket已经不存在,在下一次读或写本方socket的时候会产生错误,但是缺省情况下,至少需要两个小时才能发现错误,这是由于tcp协议的超时决定的。
有资料说可以修改这个值,你不妨试一下,在这个文件里:
/proc/sys/net/ipv4/tcp_keepalive_time
如果想每次系统启动都修改,可以将修改命令放到/etc/profile里面,或者将参数放到/etc/sysctl.conf里面。
对于tcp,有一个KeepAlive选项,可以让服务器主动定期地发送探测报文,这样就能发现对方的socket已经不存在,在下一次读或写本方socket的时候会产生错误,但是缺省情况下,至少需要两个小时才能发现错误,这是由于tcp协议的超时决定的。
有资料说可以修改这个值,你不妨试一下,在这个文件里:
/proc/sys/net/ipv4/tcp_keepalive_time
如果想每次系统启动都修改,可以将修改命令放到/etc/profile里面,或者将参数放到/etc/sysctl.conf里面。
|
在很多系统上tcp_keepalive_time是全局的,即修改后会影响系统中的所有socket连接,因此没有把握不要使用该方法。一般应用程序采用写自己的心跳函数来探测对方是否还活着。
|
你看到链路依然存在,这个由tcp协议所决定的,在服务器和客户端没有完成断开连接的4次(也有3次的)握手前,他会认为这个连接一直保持的,一直到一个特定的时间没有受到数据为止,这个时间就是/proc/sys/net/ipv4/tcp_keepalive_time的内容。
|
显然是你的保活机制没有做好。。。