关于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, ...
随机推荐
- Ubuntu下安装为知笔记
之前在Windows下用的是有道云笔记,但是后来开始习惯使用Linux开发,有道云官方并没有提供Ubuntu的版本,所以权衡之下,选择了为知笔记,安装步骤: sudo add-apt-reposito ...
- 【vs2013】如何在VS的MFC中配置使用GDI+?
摘自:http://www.cnblogs.com/CSGrandeur/p/3156843.html (已实验,可行) 1.配置GDI+ VS2010自带GDI+,直接使用. (1)首先要添加头文件 ...
- 核PCA投影平面公式推导
样本方差推导 样本方差公式\[S = \frac{1}{n-1}\sum_{i=1}^n(x_i-\mu_i)^2\] 扩展开来得到\[S = \frac{1}{n-1}[(X-\frac{1}{n} ...
- 关于setdefault和defaultdict
c参考链接:http://blog.csdn.net/real_ray/article/details/17919289 defaultdict就是为没有的键给一个默认的值,实际是实现了一个__mis ...
- Swift-ScrollView轮播图的简易封装和使用
不多说,轮播图是开发中必要一项技能,直接上代码: 先说我的思路:首次继承于UIScrollView类自定义MyScrollView,在MyScrollView里自定制方法,func creatMySc ...
- (转)Android高性能编程(1)--基础篇
关于专题 本专题将深入研究Android的高性能编程方面,其中涉及到的内容会有Android内存优化,算法优化,Android的界面优化,Android指令级优化,以及Android应用内存占 ...
- List,ArrayList
List是一个接口,而ListArray是一个类. ListArray继承并实现了List. 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造. Lis ...
- Linux增加Swap分区
Linux增加Swap分区 dd if=/dev/zero of=/data/swap/swapfile1 bs=4096 count=2097152 mkswap /data/swap/swapfi ...
- 利用ffmpeg一步一步编程实现摄像头采集编码推流直播系统
了解过ffmpeg的人都知道,利用ffmpeg命令即可实现将电脑中摄像头的画面发布出去,例如发布为UDP,RTP,RTMP等,甚至可以发布为HLS,将m3u8文件和视频ts片段保存至Web服务器,普通 ...
- 安装用于跨平台移动开发的 Visual C++
安装用于跨平台移动开发的 Visual C++ Visual Studio 2015 若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 20 ...