程序背景:
客户端与服务端通过短连接通信,客户端发送消息频率为 600条/秒
BUG现象:
客户端向服务端发送一段时间的消息后,客户端无法与服务段建立连接,
查看服务端端口状态
netstat -an|grep 37058
发现存在大量SYN_RECV以及CLOSE_WAIT
查看客户端端口状态
netstat -an|grep 37058
发现存在大量的SYN_SENT以及FIN_WAIT_1
由于在服务端日志中曾经出现个 104 这个错误码,OS error code 104: Connection reset by peer
而产生这个错误码后,会触发SIGPIPE信号。
因此猜想,出现SYN_RECV 和CLOSE_WAIT状态,是由于ACCEPT以及CLOSE函数调用时,被SIGPIPE中断,导致当时函数正在处理的端口出现异常状态。
BUG解决:
通过signal(SIGPIPE,SIG_ING) 忽略SIGPIPE信号,防止端口出现SYN_RECV以及CLOSE_WAIT状态。