Linux下TCP连接端口的时候调用close函数,有优雅断开和强制断开两种,都是通过设置socket描述符的linger属性来实现。
linger数据结构如下:
1 2 3 4 5 6
| #include <arpa/inet.h>
struct linger { int l_onoff; int l_linger; };
|
| 条件 |
描述 |
说明 |
| l_onoff = 0 |
close立刻返回,底层会将未发送完的数据发送完之后再释放资源,即优雅退出。 |
内核默认。 |
| l_onoff != 0 且 l_linger = 0 |
close会立刻返回,但不会发送未发送完的数据,而是通过一个RST包强制的关闭socket描述符,即强制退出。 |
TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方, 而不是通常的四分组终止序列,这避免了TIME_WAIT状态。 |
| l_onff != 0 且 l_linger > 0 |
close不会立刻返回,内核会延迟一段时间,这个时间就由 l_linger 的值来决定。如果超时时间到达之前,发送完未发送的数据(包括FIN包)并得到另一端的确认,close会返回正确,socket描述符优雅性退出。否则,close会直接返回错误值,未发送数据丢失,socket描述符被强制性退出。需要注意的是,如果socket描述符被设置为非阻塞,则close()会直接返回值。 |
|
|
|
|
使用方法
1 2
| struct linger li = {0, 0}; setsockopt(socketfd, SOL_SOCKET, SO_LINGER, (void*)&li, sizeof(li));
|