关于SO_LINGER选项的使用
结论:
linux开启SO_LINGER时,如果设置l_linger为非0, 不管是阻塞socket,非阻塞socket, 在这里都会发生阻塞, 而并不是UNP所讲到的( 非阻塞socket会立即返回EWOULDBLOCK)
测试结果见这里
https://www.nybek.com/blog/2015/03/05/cross-platform-testing-of-so_linger/

说明: close的行为受SO_LINGER选项影响
1.默认情况
l_onoff = 0
l_linger = 0
close会将FIN包送入发送缓冲区,并立即返回,发送缓冲区的数据由系统接管,系统将数据发送完后,释放fd.
2.开启SO_LINGER
l_onoff = 1
l_linger = 0
close会立即返回,发送缓冲区的数据将丢弃,并给对端发送RST信号,重置连接, close发送方直接进入CLOSED状态,中间没有time_wait,
所以有些人在处理time_wait过多的情况时,建议采用这种方式, 这种方式的缺点是, 发送缓冲区的数据丢了,
如果是服务端就不建议这样搞了, 一是不建议服务端主动发起close, 二是这样会给客户端的数据会丢
3.开启SO_LINGER, 同时引入超时时间
l_onoff = 1
l_linger > 0
close会延迟返回, 在linux环境下有两种情况, (其它平台下,会有不同的表现,本文只是说linux)
a.在超时时间内,阻塞,直到收到对端ACK返回时,返回
b.在超时时间内,阻塞, 若对端没有ACK应答,则在超时时间到达后返回
这种方式,服务端不建议使用,因为服务端调用close时,一但对端没有应答,或者ACK应答时间过长, 服务器阻塞的时间就会很长,影响服务器性能.
关于SO_LINGER选项的使用的更多相关文章
- setsockopt 设置 SO_LINGER 选项
setsockopt 设置 SO_LINGER 选项 最近和后台的server通信 server发现在读数据的时候 客户端已经关闭连接 ,也就是 没有等服务器读完数据,客户端已经fclose了, 联 ...
- SOCKET:SO_LINGER 选项
好多次接触到SO_LINGER选项,但总是忘了这是干什么用的.现在整理一下,我才明白这个参数是用来设定“SOCKET在CLOSE时候是否等待缓冲区发送完成”这个特性的.下面是一些详细的说明. sets ...
- TCP协议中的SO_LINGER选项
TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工 ...
- Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR
from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO ...
- setsockopt 设置TCP的选项SO_LINGER
SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成. 没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工作并返回.如果设置了SO_LINGE ...
- TCP选项之SO_LINGER
SO_LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset(RST)客户端连接的bug. SO_LINGER作用设置函数close()关闭TCP连接时的行为.缺省close() ...
- TCP套接字选项SO_LINGER与TCP_LINGER2
概述 本文对两个LINGER相关的套接字选项进行源码层面的分析,以更明确其各自的作用和区别: man page SO_LINGER,该选项是socket层面的选项,通过struct linger结构来 ...
- socket选项总结(setsocketopt)
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...
- Linux 高性能服务器编程——socket选项
socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...
随机推荐
- Apache中 RewriteCond 规则参数介绍 转
摘要: RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令.条件之后的重写规则仅在当前URI与Pattern匹配并且满足此 ...
- HihoCoder - 1236 Scores (五维偏序,分块+bitset)
题目链接 题意:给定n个五维空间上的点,以及m组询问,每组询问给出一个点,求五个维度都不大于它的点有多少个,强制在线. 神仙题 单独考虑每个维度,把所有点按这个维度上的大小排序,然后分成T块,每块用一 ...
- 剑指offer-第四章解决面试题的思路(从上往下打印二叉树)
题目:从上往下打印二叉树的每一个节点,同一层的节点按照从左到右的顺序打印 思路:这是一个层序遍历的问题,因此要借用到队列.我们可以在打印第一个节点的同时将这个节点的左右子节点都放入队列,同样打印左右子 ...
- 【sqlite】判断sqlite数据库表是否存在
SQLite语句: cmd.CommandText = "SELECT count(*) from sqlite_master where type='table' and name='ta ...
- Spring IOC容器在Web容器中是怎样启动的
前言 我们一般都知道怎样使用spring来开发web应用后,但对spring的内部实现机制通常不是很明白.这里从源码角度分析下Spring是怎样启动的.在讲spring启动之前,我们先来看看一个web ...
- CSS3的圆角border-radius属性
一,语法解释 border-radius : none | <length>{1,4} [/ <length>{1,4} ] <length>: 由浮点数字和单位标 ...
- Android蓝牙UUID简要
UUID是"Universally Unique Identifier"的简称,通用唯一识别码的意思.对于蓝牙设备,每个服务都有通用.独立.唯一的UUID与之对应.也就是说,在同一 ...
- Oracle与Mysql操作表序列
一.Oracle添加表序列 CREATE SEQUENCE name -- 序列名 INCREMENT BY -- 每次加几个 START WITH -- 从几开始计数 MINVALUE --- 最小 ...
- python 递归函数和二分查找
1.初始递归 递归属于函数中的一种特殊函数,功能迅速并且干净利落,在函数中递归的基本就是在函数中调用自己本身 def func(): print(111) func() func()#将会无限循环‘1 ...
- Flex布局(转载)
网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...