结论:

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. HTTP浅析

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  2. [leetcode]_Interleaving String

    下午去蹭了一发新浪的笔试. 炒鸡多的网络基础知识,总共18道题,就写了8道左右吧,剩下的全是网络知识,这部分抽时间至少过一过. 其中一道算法题,回来跟嘟嘟商量,才发现是leetcode上的原题,连ex ...

  3. python库之threading

    This module constructs higher-level threading interfaces on top of the lower level python库之_threadmo ...

  4. Jetty服务怎么配置,如何发布项目

    Jetty相对于Tomcat来时相对较轻,适合多并发且有较多实时通讯的系统,能够稳定的保持连接且占用资源相对较少.今天就简单介绍一下Jetty的配置及项目部署. 工具/原料 Jetty 电脑 Jett ...

  5. 为什么 I2C(IIC)需要上拉电阻

    源鑫问: I2C时钟线和数据线为什么要接上拉电阻? 因为 I2C 的 IO 是开漏的,所以需要上拉电阻. 延伸: 之前 hippo曾经说过有人将 IO 设置为 PP,可能会烧 IO. 之前以为 I2C ...

  6. 2018年总结和2019年的Flag

    ---恢复内容开始--- 目前截止到现在工作将近一年半了,今天工作上主要后端主要是用了两种语言,java和Python(2.7),今年完成主要的工作主要使用Python在写一些脚本来满足财务和人资部门 ...

  7. 为IIS Host ASP.NET Web Api添加Owin Middleware

    将OWIN App部署在IIS上 要想将Owin App部署在IIS上,只添加Package:Microsoft.OWIN.Host.SystemWeb包即可.它提供了所有Owin配置,Middlew ...

  8. 苹果手机 iTunes 资料备份到另一手机

    百度教程 https://jingyan.baidu.com/article/d621e8da332e602865913f8e.html 直接使用iTunes将老手机的资料备份, (可能需要关闭手机定 ...

  9. 用xshell-ssh连接服务器被经常意外中断

    xshell突然中断报错 Socket error Event: 32 Error: 10053.Connection closing...Socket close. Connection close ...

  10. 【转】windows下mysql5.1忘记root密码解决方法

    步骤如下:1.停止mysql服务(以管理员身份,在cmd命令行下运行) net stop mysql D:\>net stop mysql MySQL 服务正在停止. MySQL 服务已成功停止 ...