发布网友 发布时间:12小时前
共1个回答
热心网友 时间:12小时前
服务端遇到socket异常断开后,端口号出现TIME_WAIT状态,导致无法立即重新开启监听,此现象表现为_sock_err()返回错误值98。需寻找解决方案。
根据网络上的指导,调整内核文件
etc/sysctl.conf
内加入以下设置:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range= 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_intvl = 2
执行
/sbin/sysctl -p
以使设置生效。尝试重启network服务,命令为
sudo /etc/init.d/network-manager restart
但问题并未解决。
最终在客户端和服务端代码中添加了socket属性SO_LINGER。问题得到了解决,经过多次实验,再也没有出现TIME_WAIT现象。具体是哪个设置起作用,不太清楚。日后再深入研究。
小提示:
使用netstat -ap | grep 21127查看指定端口号的状态。
使用netstat -ap查看当前用户下所有端口的使用情况。