server被强制关闭,

一个client和一个Server,两者之间建立了一个基于TCP的socket连接,在刚刚建立好连接后,尚未进行数据传输,Server端应用程序突然crush掉了,现在立刻重启Server端应用程序(假设间隔很短),一般情况下Server端应用程序是无法启动的。请问是什么原因?

It's because of the socket resource can not be release immediately, setsockopt() can help to finish it

因为绑定的socket还处于CLOSE_WAIT状态,如果用setsockopt,设置SO_REUSEADDR,则不会出现这种情况

Socket编程步骤

多线程同步 socket通信等

Linux下Socket编程

Linux的网络编程

“Cannot assign requested address”

netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

发现端口占用中处于TIME_WAIT状态的有多达20000+,基本占用了全部的端口,要详细了解端口状态,需要从TCP的状态转换说起。

  其中TIME_WAIT状态的产生源自于TCP连接的结束,TCP要保证在所有可能的情况下使得所有的数据都能够正确被投递。当关闭一个 socket 连接时,主动关闭一端的 socket 将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态。

当一个socket关闭的时候,是通过两端互发信息的四次握手过程完成的,当一端调用close()时,就说明本端没有数据再要发送了。这好似看来在握手完成以后,socket就都应该处于关闭CLOSED状态了。但这有两个问题: 
1. 我们没有任何机制保证最后的一个ACK能够正常送达 
2. 网络上仍然有可能有残余的数据包(wandering duplicates,或老的重复数据包),我们也必须能够正常处理。

  正常的系统中,可分配的端口号是有限的,但是处于TIME_WAIT状态的连接,虽然已经要确认关闭了,但是仍然占住端口不撒手,一般需要2MSL的时间,现实时长大概在两分钟左右,所以在有限的端口使用完之后,新的请求没有可以安放的地方,便出现了上述错误。
crazyk_wkb

解决方法:

执行命令修改如下2个内核参数 (需要root权限)

vim /etc/sysctl.conf

net.ipv4.tcp_tw_reuse =
net.ipv4.tcp_tw_recycle = 

或者
sysctl -w net.ipv4.tcp_timestamps=1  开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用
sysctl -w net.ipv4.tcp_tw_recycle=1  表示开启TCP连接中TIME-WAIT sockets的快速回收

上一篇:Python 数据分析Windows环境搭建


下一篇:MySQL之插入数据(添加数据)-INSERT