服务端开启了TCP服务,客户端连接,正常的情况下当服务端closesocket后向客户端发送FIN,客户端回应ACK,此时服务端进入FIN_WAIT2状态,等待客户端发送FIN然后进入CLOSED。
这时,客户端还可以send一次数据,send完后,服务端收到后就会向客户端发送RST并进入CLOSED
若客户端始终不发送数据,并且也不Close,那么服务端的FIN_WAIT2会持续要一个默认超时(一般是60s),这个种残留链接太多的时候可能会消耗服务端资源,降低性能,甚至无法正常工作。
我们可以使用SO_LINGER来改变关闭连接的行为
struct linger lg;
lg.l_onoff = 1;
lg.l_linger = 0;
setsockopt(sk, SOL_SOCKET, SO_LINGER, (char*)&lg, sizeof(lg));
| l_onoff | l_linger | closesocket行为 | 发送队列 | 底层行为 |
| l零 | 忽略 | 立即返回。 | 保持直至发送完成。 | 系统接管套接字并保证将数据发送至对端。 |
| 非零 | 零 | 立即返回。 | 立即放弃。 | 直接发送RST包,自身立即复位,不用经过2MSL状态。对端收到复位错误号。 |
| 非零 | 非零 | 阻塞直到l_linger时间超时或数据发送完成。(套接字必须设置为阻塞zhu |
优化TCP连接关闭:SO_LINGER与非标准解决方案

本文探讨了如何通过SO_LINGER选项控制TCP连接关闭流程,特别提到使用OVERLAPPED结构影响残留连接的行为。通过设置SO_LINGER改变closesocket后的RST行为,并介绍了非标准方法如ReadFile配合OVERLAPPED在异常情况下的处理。
最低0.47元/天 解锁文章
442

被折叠的 条评论
为什么被折叠?



