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)

服务端关闭,客户端仍然尝试连接时,客户端就报此错误

posted on 2023-04-10 11:06  Netsharp  阅读(462)  评论(0编辑  收藏  举报

导航