结论:

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选项的使用的更多相关文章

  1. setsockopt 设置 SO_LINGER 选项

    setsockopt 设置 SO_LINGER 选项 最近和后台的server通信 server发现在读数据的时候  客户端已经关闭连接 ,也就是 没有等服务器读完数据,客户端已经fclose了, 联 ...

  2. SOCKET:SO_LINGER 选项

    好多次接触到SO_LINGER选项,但总是忘了这是干什么用的.现在整理一下,我才明白这个参数是用来设定“SOCKET在CLOSE时候是否等待缓冲区发送完成”这个特性的.下面是一些详细的说明. sets ...

  3. TCP协议中的SO_LINGER选项

    TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工 ...

  4. Linux网络编程socket选项之SO_LINGER,SO_REUSEADDR

    from http://blog.csdn.net/feiyinzilgd/article/details/5894300 Linux网络编程中,socket的选项很多.其中几个比较重要的选项有:SO ...

  5. setsockopt 设置TCP的选项SO_LINGER

    SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成. 没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工作并返回.如果设置了SO_LINGE ...

  6. TCP选项之SO_LINGER

    SO_LINGER这个选项在我以前带队改造haproxy的时候引出过一个reset(RST)客户端连接的bug. SO_LINGER作用设置函数close()关闭TCP连接时的行为.缺省close() ...

  7. TCP套接字选项SO_LINGER与TCP_LINGER2

    概述 本文对两个LINGER相关的套接字选项进行源码层面的分析,以更明确其各自的作用和区别: man page SO_LINGER,该选项是socket层面的选项,通过struct linger结构来 ...

  8. socket选项总结(setsocketopt)

    功能描述:        获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项, ...

  9. Linux 高性能服务器编程——socket选项

    socket选项函数 功能:用来读取和设置socket文件描述符属性的方法 函数: #include <sys/scoket.h> int getsockopt ( int sockfd, ...

随机推荐

  1. cowboy实现websocket

    使用cowboy实现websocket主要实现以下回调函数 下面的函数返回值要具体弄清楚原因参考 websocket具体协议  主要就是两个部分 握手和数据传输 -export([init/3]).  ...

  2. 9.9 Python 文档字符串

    9.9 Python 文档字符串. 进入 Python 标准库所在的目录. 检查每个 .py 文件看是否有__doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会 ...

  3. 【JQuery】学习

    JavaScript参考 JQuery 学习总结及实例 1.JQuery概念 A.Jquery是一个优秀的Javascript框架.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器,jQuery ...

  4. QLCDNumber设置背景色和显示数字颜色【转载】

    http://www.qtcn.org/bbs/read-htm-tid-55176.html //LCD时间显示    QLCDNumber *m_pLcdTime = new QLCDNumber ...

  5. ubuntu下使用code::blocks编译运行一个简单的gtk+2.0项目

    在具体的操作之前,首先需要安装一些必要的软件.ubuntu下默认安装了gcc,不过缺少必要的Header file,可以在命令行中输入下面的指令安装build-essential套件:sudo apt ...

  6. Shell脚本基础知识详细介绍(一)

    Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种 ...

  7. DHCP(二)

    提供阶段:即DHCP服务器向DHCP客户端提供预分配IP地址的阶段.网络中的所有DHCP服务器接收到客户端的DHCP Discover报文后,都会根据自己地址池中IP地址分配的优先次序选出一个IP地址 ...

  8. py编码终极版

    说起python编码,真是句句心酸.算起来,反复折腾两个来月了.万幸的是,终于梳理清楚了.作为一个共产主义者,一定要分享给大家.如果你还在因为编码而头痛,那么赶紧跟着我咱们一起来揭开py编码的真相吧! ...

  9. Document.location.href和.replace的区别

    转自:https://www.cnblogs.com/GT_Andy/archive/2007/10/31/1922138.html 1 Document.location.href和.replace ...

  10. webpack4+vue2+axios+vue-router的多页+单页混合应用框架

    VUE2的单页应用框架有人分享了,多页应用框架也有人分享了,这里就分享一个单页和多页的混合应用框架吧,初现雏形,还有很多需要优化和改善的地方... 结尾有github地址. 项目结构 │ ├─buil ...