setsockopt 设置 SO_LINGER 选项

setsockopt 设置 SO_LINGER 选项

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

so_linger

此选项指定函数close对面向连接的协议如何操作(如TCP)。内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方。

SO_LINGER选项用来改变此缺省设置。使用如下结构:

struct linger {

int l_onoff; /* 0 = off, nozero = on */

int l_linger; /* linger time */

};

有下列三种情况:

1、设置 l_onoff为0,则该选项关闭,l_linger的值被忽略,等于内核缺省情况,close调用会立即返回给调用者,如果可能将会传输任何未发送的数据;

//这种情况下, close过程是强制的, 是否发送未被读取到的数据是不确定的(滑动窗口) ,会导致服务器读取一个失败的连接。

2、设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;

3、设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。如果套接口缓冲区中仍残留数据,进程将处于睡眠状态,直 到(a)所有数据发送完且被对方确认,之后进行正常的终止序列(描述字访问计数为0)或(b)延迟时间到。此种情况下,应用程序检查close的返回值是非常重要的,如果在数据发送完并被确认前时间到,close将返回EWOULDBLOCK错误且套接口发送缓冲区中的任何数据都丢失。close的成功返回仅告诉我们发送的数据(和FIN)已由对方TCP确认,它并不能告诉我们对方应用进程是否已读了数据。如果套接口设为非阻塞的,它将不等待close完成。

原文 http://blog.csdn.net/factor2000/article/details/3929816   应该是C语言的

时间: 2024-08-11 01:33:28

setsockopt 设置 SO_LINGER 选项的相关文章

setsockopt 设置TCP的选项SO_LINGER

SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成. 没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工作并返回.如果设置了SO_LINGER选项,并且等待时间为正值,则在清理之前会等待一段时间. 以调用close()主动关闭为例,在发送完FIN包后,会进入FIN_WAIT_1状态.如果没有延迟关闭(即设置SO_LINGER选项),在调用tcp_send_fin()发送FIN后会立即调用sock_orphan()将sock结构从进程上下

TCP协议中的SO_LINGER选项

TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工作并返回.如果设置了SO_LINGER选项,并且等待时间为正值,则在清理之前会等待一段时间. 以调用close()主动关闭为例,在发送完FIN包后,会进入FIN_WAIT_1状态.如果没有延迟关闭(即设置SO_LINGER选项),在调用tcp_send_fin()发送FIN后会立即调用sock_or

setsockopt设置socket状态

setsockopt设置socket状态 1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:BOOL bReuseaddr=TRUE;setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:BOOL bDontLinger = FAL

高性能网络服务器--SO_LINGER选项 会话创建

SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为.在默认情况下,当说我们使用close系统调用关闭一个socket时,close立即返回,TCP模块负责把socket对应的TCP发送缓冲区中残留的数据发送给对方. 根据linger结构体中两个变量的不同值,会有三种不同的结果: 1.l_onoff==0 ,此时SO_LINGER选项不起作用,close用默认行为来关闭socket. 2.l_onoff != 0 && l_linger==0.此时close的行为取决于

关于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

Navicat 导出向导之设置附加选项

Navicat 设置导出向导的附加选项设置根据用户设置的文件格式而定.本教程将详解 Navicat 在设置导出向导时如何设置附加选项. 包含列的标题:勾选此项,栏位名将会包含在导出的文件. 添加:如果用户在设置导出目标文件名时为多个表选择“导出选择的到相同文件”选项,勾选此项可在导出的文件添加记录. 遇到错误继续:在导出进程中忽略遇到的错误. 在 XML 中使用属性格式:为文件定义“记录分隔符”.“栏位分隔符”和“文本限定符”. Navicat 设置附加选项 日期排序.日期分隔符.零填充日期.时

NIO设置SO_LINGER引发的异常

欢迎关注Github:https://github.com/teaey/ ### 背景 银时跟我讲,想从 Netty3迁移到Netty4 . 问其原因是因为 Netty3在容器里会报错,错误堆栈: java.io.IOException: 无法立即完成一个非阻止性套接字操作. at sun.nio.ch.SocketDispatcher.close0(Native Method) at sun.nio.ch.SocketDispatcher.preClose(SocketDispatcher.j

Bash Shell-使用内置的set和shopt命令设置bash选项

使用内置的set和shopt命令设置bash选项 set命令可以用来定制shell环境,使用选项"o"来打开或者关闭选项.例如打开选项:set -o 选项,关闭选项目:set +o 选项. 例如要打开vi交互式命令行编辑,则如下: [[email protected] ~]# set -o   #查看当前设置情况allexport       offbraceexpand     onemacs           onerrexit         offerrtrace      

JQuery获取和设置Select选项常用方法总结 (转)

1.获取select 选中的 text: $("#cusChildTypeId").find("option:selected").text(); $("#cusChildTypeId option:selected").text()2.获取select选中的 value: $("#ddlRegType ").val();3.获取select选中的索引:      $("#ddlRegType ").get