SOCKET常见错误
1. Cannot assign requested address(99)
1.1 问题描述
由于linux分配的客户端连接端口用尽,无法建立socket连接所致,虽然socket正常关闭,但是端口不是立即释放,而是处于TIME_WAIT状态,默认等待60s后才释放,端口才可以继续使用。
是客户端的问题不是服务器端的问题。通过netstat,的确看到很多TIME_WAIT状态的连接。
client端频繁建立连接,而端口释放较慢,导致建立新连接时无可用端口。
$ netstat -a|grep TIME_WAIT
tcp 0 0 e100069210180.zmf:49477 e100069202104.zmf.tbs:websm TIME_WAIT
tcp 0 0 e100069210180.zmf:49481 e100069202104.zmf.tbs:websm TIME_WAIT
tcp 0 0 e100069210180.zmf:49469 e100069202104.zmf.tbs:websm TIME_WAIT
...
...
1.2 解决办法1
执行命令修改如下内核参数 (需要root权限)
# 修改文件:/etc/sysctl.conf
# 1. 调低端口释放后的等待时间,默认为60s,修改为15s:
sudo sysctl -w net.ipv4.tcp_fin_timeout=15
# 2. 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0,修改为1,释放TIME_WAIT端口给新连接使用:
sudo sysctl -w net.ipv4.tcp_timestamps=1
# 3. 修改tcp/ip协议配置,快速回收socket资源,默认为0,修改为1:
sudo sysctl -w net.ipv4.tcp_tw_recycle=1
# 4. 允许端口重用
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
linux内核版本从4.12之后,/proc/sys/net/ipv4/tcp_tw_recycle
已经被废弃了,请忽略下面错误
sysctl: cannot stat /proc/sys/net/ipv4/tcp_tw_recycle: No such file or directory
1.3 解决办法2
# 修改文件:/etc/sysctl.conf
# 1. 扩大可使用端口范围
net.ipv4.ip_local_port_range = 5000 65000
# 2. 设置最大TIME_WAIT数量
net.ipv4.tcp_max_tw_buckets = 10000
2. Too many open files(24)
客户端在刚超过1000个连接时报错
$ ulimit -n
1024
参见设置:https://www.cnblogs.com/Netsharp/p/17300304.html
3. Bad file descriptor(9)
一端非正常关闭时,另外一端会有这个错误,一般是代码关闭状态没处理好导致的。重点从代码上找问题。
4. Connection timed out(110)
当服务端有几千个(2000-5000)长连接时,客户端报错,不能连上服务端。
在服务端正常的情况下,客户端报此错误。
根据我的经验,一般使用家庭的路由器时候会报这个错误,其他电脑访问网页也不太正常了,在云服务器上则没有这个问题。
可能是家庭路由器有限制(几千个连接到2w个连接不等),或者需要其他的设置。
5. Connection refused(111)
服务端关闭,客户端仍然尝试连接时,客户端就报此错误
作者 :秋时
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。