服务器端出现大量SYN_RECV状态,导致客户端无法连接

程序背景:

客户端与服务端通过短连接通信,客户端发送消息频率为 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状态。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 环境下 TCP 客户通信的详细过程如下: 1. 创建 socket:客户使用 socket() 函数创建一个套接字。该函数返回一个整数值,表示套接字的文件描述符。 2. 连接服务器客户使用 connect() 函数连接服务器。在调用 connect() 函数之前,需要先指定服务器的 IP 地址和口号。connect() 函数返回一个整数值,表示连接是否成功。 3. 发送数据:客户使用 send() 函数向服务器发送数据。send() 函数的参数包括套接字的文件描述符、指向发送数据缓冲区的指针以及数据的长度。 4. 接收数据:客户使用 recv() 函数接收服务器发送过来的数据。recv() 函数的参数包括套接字的文件描述符、指向接收数据缓冲区的指针以及数据的长度。 5. 关闭连接客户使用 close() 函数关闭套接字的文件描述符。在关闭连接之后,客户无法继续与服务器通信。 需要注意的是,在连接服务器之前,客户需要指定服务器的 IP 地址和口号。连接建立成功后,客户服务器之间的通信就可以开始了。在通信过程中,客户服务器需要进行数据的分段和重组,以保证数据的完整性和可靠性。 另外,在连接建立过程中,客户服务器都需要进行三次握手,以确保连接的可靠性。三次握手的基本过程如下: 1. 客户服务器发送 SYN 报文,请求建立连接。 2. 服务器收到客户的 SYN 报文后,向客户发送 SYN+ACK 报文,表示收到请求,并请求建立连接。 3. 客户收到服务器的 SYN+ACK 报文后,向服务器发送 ACK 报文,表示已经收到服务器的确认,并建立连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值