linux so_nosigpipe,TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL设置

下面是TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL的设置方法:

其中由于平台的不同,区分SO_NOSIGPIPE和MSG_NOSIGNAL有所分区:

int optval = 1;

// turn off SIGPIPE signal

#ifdef __linux__

setsockopt(m_Sockfd, SOL_SOCKET, MSG_NOSIGNAL, &optval, sizeof(optval));

#else

setsockopt(m_Sockfd, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval));

#endif

// set SO_LINGER so socket closes gracefully

struct linger ling;

ling.l_onoff = 1;

ling.l_linger = 10;

setsockopt(m_Sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));

// disable the Nagle algorithm so that small packets get sent immediately

int flag = 1;

setsockopt(m_Sockfd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(int));

另外转载一篇:

setsockopt设置 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调用会立即返回给调用者,如果可能将会传输任何未发送的数据;

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完成。

注释:l_linger的单位依赖于实现: 4.4BSD假设其单位是时钟滴答(百分之一秒),但Posix.1g规定单位为秒。

下面的代码是一个使用SO_LINGER选项的例子,使用30秒的超时时限:

#define TRUE     1

#define FALSE    0

int z; /* Status code

*/ int s;       /* Socket s */

struct linger so_linger;

...

so_linger.l_onoff = TRUE;

so_linger.l_linger = 30;

z = setsockopt(s,

SOL_SOCKET,

SO_LINGER,

&so_linger,

sizeof so_linger);

if ( z )

perror("setsockopt(2)");

下面的例子显示了如何设置SO_LINGER的值来中止套接口s上的当前连接:

#define TRUE     1

#define FALSE    0

int z; /* Status code */

int s;       /* Socket s */

struct linger so_linger;

...

so_linger.l_onoff = TRUE;

so_linger.l_linger = 0;

z = setsockopt(s,

SOL_SOCKET,

SO_LINGER,

&so_linger,

sizeof so_linger);

if ( z )

perror("setsockopt(2)");

close(s); /* Abort connection */

在上面的这个例子中,当调用close函数时,套接口s会立即中止。中止的语义是通过将超时值设置为0来实现的。

/********** WINDOWS **********/

/* 当连接中断时,需要延迟关闭(linger)以保证所有数据都被传输,所以需要打开SO_LINGER这个选项;

* //注:大致意思就是说SO_LINGER选项用来设置当调用closesocket时是否马上关闭socket;

* linger的结构在/usr/include/linux/socket.h中定义://注:这个结构就是SetSocketOpt中的Data的数据结构

*  struct linger

*  {

*   int l_onoff;  /* Linger active */       //低字节,0和非0,用来表示是否延时关闭socket

*   int l_linger; /* How long to linger */   //高字节,延时的时间数,单位为秒

*  };

*  如果l_onoff为0,则延迟关闭特性就被取消。

*   如果非零,则允许套接口延迟关闭; l_linger字段则指明延迟关闭的时间

*/

更具体的描述如下:

1、若设置了SO_LINGER(亦即linger结构中的l_onoff域设为非零),并设置了零超时间隔,则closesocket()不被阻塞立即执行,不论是否有排队数据未发送或未被确认。这种关闭方式称为“强制”或“失效”关闭,因为套接口的虚电路立即被复位,且丢失了未发送的数据。在远端的recv()调用将以WSAECONNRESET出错。

2、若设置了SO_LINGER并确定了非零的超时间隔,则closesocket()调用阻塞进程,直到所剩数据发送完毕或超时。这种关闭称为“优雅”或“从容”关闭。请注意如果套接口置为非阻塞且SO_LINGER设为非零超时,则closesocket()调用将以WSAEWOULDBLOCK错误返回。

3、若在一个流类套接口上设置了SO_DONTLINGER(也就是说将linger结构的l_onoff域设为零),则closesocket()调用立即返回。但是,如果可能,排队的数据将在套接口关闭前发送。请注意,在这种情况下WINDOWS套接口实现将在一段不确定的时间内保留套接口以及其他资源,这对于想用所以套接口的应用程序来说有一定影响。

SO_DONTLINGER 若为真,则SO_LINGER选项被禁止。

SO_LINGER延迟关闭连接 struct linger上面这两个选项影响close行为;

选项                       间隔         关闭方式    等待关闭与否

SO_DONTLINGER   不关心     优雅           否

SO_LINGER             零             强制          否

SO_LINGER             非零         优雅          是

参考:http://blog.csdn.net/factor2000/article/details/3929816

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity将来时:IL2CPP是什么?

Unity3D 想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用在很商业的游戏制作上。Unity3D最大的一个特点是一次制作,多平台部署,而 这一核心功能是靠Mono实现的。可以说Mono是Unity3D核心的核心,是…

计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...

信息论与编码课程设计报告设计题目: 统计信源熵与香农编码专业班级 电 信 12-06学 号学生姓名指导教师教师评分2015 年 3 月 30 日目 录- 0 -一、设计任务与要求1.统计信源熵要求:统计任意文本文件中各字符(不区分大小写)数量,计算字符概率&a…

手游频繁崩溃”闪退”? 从程序上找原因

手游频繁崩溃”闪退”? 从程序上找原因 作为玩家,当游戏crash的时候是什么心情,如果这个游戏玩起来还不错的话,那我可能还会打开第二次,如果这个游戏一般的话我可能直接怒删了。当多次出现闪退crash的时候,…

汇编语言属于C语言吧,汇编语言和c语言的区别是什么

区别:汇编语言的效率高,对硬件的可操控性更强,体积小,不易维护,可移植性很差;c语言的效率比较低,硬件可操控性比较差,目标代码体积大,容易维护,可移植性很好。…

c语言某一行不被优化,C语言优化小技巧

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼在编写C语言程序后,经常需要对源码进行优化,以提高程序的运行效率,下面简述几个常用的优化技巧以供大家参考:1.C于代码在程序中的优化现在的C编译器会自动对代码进行优化,…

一款已上市MMO手游地图同步方案总结

1. 客户端地图格子的相关知识在2.5D的MMO游戏里,角色是通过3D的方式渲染,2D的地图是通过2D的方式显示,所以在客户端一般会有三个坐标系: a) 3D坐标系:所有需要3D渲染的角色和光效,都以3D坐标系中定位。 b) …

策略模式与简单工厂模式区别(转)

最近一直在抽时间研究设计模式,之前对设计模式也有一定的了解,但是都没有平心静气的去研究过,只是了解了一些皮毛,最近打算再深入研究一下,重新打开了设计模式的数据,对之前的疑问一个个的刨根问底&#xf…

c语言中枚举类型的长度,C中的枚举类型数据的大小是多少?

这是一个C面试测试问题不是家庭作业。#include using namespace std;enum months_t { january, february, march, april, may, june, july, august, september,october, november, december} y2k;int main (){cout << "sizeof months_t is " << sizeof(m…

求平方根sqrt()函数的底层算法效率问题

我们平时经常会有一些数据运算的操作&#xff0c;需要调用sqrt&#xff0c;exp&#xff0c;abs等函数&#xff0c;那么时候你有没有想过&#xff1a;这个些函数系统是如何实现的&#xff1f;就拿最常用的sqrt函数来说吧&#xff0c;系统怎么来实现这个经常调用的函数呢&#xf…

android espresso跨程序,Android Espresso:依次运行多个测试

我正在尝试使用Espresso forAndroid进行一系列测试.运行之间似乎没有关闭活动.一次测试后,无论应用程序状态如何,左侧为下一次测试.如何用Espresso来实现&#xff1f;错误报告中提供的修复程序的问题是,这将仅在整个套件的完成时执行.如果你想在每次测试后都有一个干净的活动堆…

C#中字符串的内存分配与驻留池

刚开始学习C#的时候&#xff0c;就听说CLR对于String类有一种特别的内存管理机制&#xff1a;有时候&#xff0c;明明声明了两个String类的对象&#xff0c;但是他们偏偏却指向同一个实例。如下&#xff1a; String s1 “Hello”; String s2 “Hello”; //s2和s1的实际值都…

signature=f2388c4f1bce538cc797410d9560f03b,KSHV strategies for host dsDNA sensing machinery

摘要&#xff1a;The innate immune system utilizes pattern recognition receptors cyclic GMP-AMP synthase(cGAS)to sense cytosolic double-stranded(ds) DNA and initiate type 1 interferon signaling and autophagy pathway, which collaborate to limit pathogen infe…

Unity 内存管理

一&#xff1a;资源类型 GameObject, Transform, Mesh, Texture, Material, Shader, noxss和各种其他Assets。 二&#xff1a;AssetBundle文件内存镜像 来自文件就用CreateFromFile(注意这种方法只能用于standalone程序&#xff09;这是最快的加载方法。也可以来自Memory,用…

1.逐帧动画shader

最近项目压力不大&#xff0c;抽时间看了些关于shader和游戏引擎的书籍&#xff0c;准备开始shader的学习。 在网上看到这位前辈&#xff08;http://blog.sina.com.cn/s/articlelist_2312702844_6_1.html&#xff09;写的博客&#xff0c;觉得很不错&#xff0c;学习曲线应该很…

panel中html怎么写,panel控件有什么用 请写出Panel控件的用途

当多个panel控件重叠时,把一个panel的visible/设置为true,其它的设置为f例如有3个panel&#xff0c;分别为panel1,panel2,panel3 如果重叠的话&#xff0c;把他们的大小设置为相同大小&#xff0c;直接通过上下层来控制即可&#xff0c;例如想要panel2显示出来&#xff0c;就用…

html页面如何实现搜索功能,使用jQuery怎么实现一个页面关键字搜索功能

使用jQuery怎么实现一个页面关键字搜索功能发布时间&#xff1a;2021-01-04 16:46:38来源&#xff1a;亿速云阅读&#xff1a;136作者&#xff1a;Leah这篇文章给大家介绍使用jQuery怎么实现一个页面关键字搜索功能&#xff0c;内容非常详细&#xff0c;感兴趣的小伙伴们可以参…

html相对定位向上偏移,使用CSS的相对定位和偏移量

这是利用CSS相对定位和偏移写成的表单输入框效果&#xff0c;不是以前用的表格那种&#xff0c;也没有用UL li&#xff0c;觉得借此示例可练习一下CSS,特别是CSS的定位和布局方面的知识&#xff0c;了解top,bottom,left,right这些偏移量属性的用法。CSS相对定位和偏移写成的表单…

2.转动的地球shader

原理很简单&#xff0c;根据时间对uv中的x轴进行位移&#xff0c;对于地面和云层&#xff0c;取不同的移动速度&#xff0c;分别计算对应的uv坐标&#xff0c;再根据uv坐标从地面和云层的纹理中分别取出对应的值&#xff0c;最后把两者用lerp函数进行混合作为最终结果。 下边的…

3.顶点外扩方法实现的描边shader

描边shader的实现有很多种&#xff0c;顶点外扩是其中之一。顶点外扩的原理是用2个Pass 渲染物体2次第一遍:描边&#xff0c;顶点沿法线方向外拓后用黑色渲染。外扩这一步的实现是在投影空间&#xff0c;也就是2D的&#xff0c;根绝法线的x和y值进行外扩&#xff0c;因为是沿着…

为此计算机所有用户安装加载项,安装Office 2013后,无法在计算机上安装Outlook加载项...

我使用Outlook Add in模板和VSTO在visual studio 2010中实现了Outlook添加&#xff0c;我使用MSI安装程序(在visual studio 2010中创建)为它创建了一个安装..我能够在所有机器上安装它(x86和x64) ) .最近我尝试在安装了Office 2013的计算机上安装相同的安装程序并收到以下错误&…