- 学习自这篇博客
- 优雅关闭是在结束传输的时候调用shutdown函数而不是close/closesocket函数
- 好处
- 调用close之后,即便仍有数据未发送,或者发送的数据尚未确认收到,对应的fd也会被销毁,也就是说连接直接中断
- 调用shutdown,并且设置了参数
SO_LINGER>0
(该参数代表延时事件)之后,连接只有超过这个事件,或者发送完数据才会中断。 shutdown()
不会销毁fd,它只会关闭字节流,但是会给对方发送FIN
信号- 优雅关闭过程
shutdown(fd, SHUT_RDWR);
struct linger linger;
linger.l_onoff = 1;
linger.l_linger = 1;
setsockopt(fd, SOL_SOCKET, SO_LINGER, (char *) &linger, sizeof(linger));
close(fd);
struct linger{
l_onoff ;
l_linger;
};
- 顾名思义:
l_onoff
代表是否开启延时,如果为0,那么,不管l_linger
的值,都会默认调用close,否则,如果l_linger>0
,则等到l_linger
事件之后才会断开连接,如果l_linger==0
则直接发送RST包给对方,不会经历四次挥手阶段,因此也就避TIME_WAIT的产生