下面是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

linux so_nosigpipe,TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL设置相关推荐

  1. TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL设置

    下面是TCP_NODELAY/SO_LINGER/SO_NOSIGPIPE/MSG_NOSIGNAL的设置方法: 其中由于平台的不同,区分SO_NOSIGPIPE和MSG_NOSIGNAL有所分区: ...

  2. linux ls文件颜色和底色设置

    转帖 : linux ls文件颜色和底色设置 白色:表示普通文件 蓝色:表示目录 绿色:表示可执行文件 红色:表示压缩文件 浅蓝色:链接文件 红色闪烁:表示链接的文件有问题 黄色:表示设备文件 灰色: ...

  3. linux 查看java最大内存配置,Linux和Windows下的内存设置

    你对Tomcat JVM内存设置是否了解,本文向大家介绍一下Linux和Windows操作系统下Tomcat JVM内存设置方法,希望对你的学习有所帮助. Linux下修改Tomcat JVM内存设置 ...

  4. linux设置账号权限设置,Linux账号管理与ACL权限设置

    1:UID和GID 用户ID:在/etc/passwd中 群组ID:在/etc/group中 2:有效群组与初始群组 初始群组:/etc/passwd文件里面的GID 有效群组: groups #查看 ...

  5. linux 内存 shared,Linux Shared Memory的查看与设置

    Linux Shared Memory的查看与设置 共享内存就是进程之间可以共享的一段内存,通过一个唯一的KEY值绑定 shmget()创建或获取 shmat()连接 shmdt()断连 共享内存的访 ...

  6. linux日志文件存放目录,Log4j 日志文件Linux/Mac/Windows通用存放位置设置方法

    log4j1/log4j2中category的配置以及log的输出位置(windows和linux通用的log输出位置) 一.场景和需求 假设我现在有3个独立的用project(暂时用maven关联起 ...

  7. 我使用过的Linux命令之hwclock - 查询和设置硬件时钟

    我使用过的Linux命令之hwclock - 查询和设置硬件时钟 本文链接:http://codingstandards.iteye.com/blog/804830   (转载请注明出处) 用途说明 ...

  8. linux 对硬盘重新分区,硬盘重新分区后,linux的硬盘表的重新设置

    硬盘重新分区后,linux的硬盘表的重新设置 发布时间:2007-12-29 16:04:19来源:红联作者:Alwaysfirm 会硬盘分区后uuid会变动,导致linux挂载硬盘出错. ----- ...

  9. linux数据库实例开机启动,linux下数据库实例开机自启动设置

    linux下数据库实例开机自启动设置 1.修改/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,如下提示 # This file is used by ORA ...

最新文章

  1. apache 限制IP访问
  2. DNN Module PictureGallery 效果图
  3. boost::allocator_size_type的实例
  4. 【重识 HTML + CSS】Photoshop 简单使用
  5. Linux开放端口、关闭防火墙操作
  6. 为IBM 3650 M2 服务器配置RAID卡(一)
  7. 20160130001 冯仑风马牛
  8. 利用DOM的方式点击切换图片及修改文字
  9. 服务器下 读取springboot application配置文件_一文读懂 Spring Boot 配置文件 application.properties !...
  10. 【新机软件安装及环境配置】(持续更新ing)
  11. 代数结构在计算机科学中的应用,代数结构
  12. 64位plsql和64位Oracle客户端安装以及注册,内含百度云资源
  13. 小米手机便签一键启动这个功能,可将便签录音秒变文字
  14. 使用SurfaceView完成地图无缝拼接
  15. 拳打电脑管家,脚踢金山毒霸,3分钟用Python撸一个杀毒软件
  16. B站2020年每周必看热门视频数据盘点(数据分析)
  17. 虚拟机包OVF和OVA的区别
  18. 这世上没有末路,你从不曾孤独
  19. 学校计算机的使用英语作文180字,计算机(Computer)
  20. deep learning编程作业总结1---喵咪识别

热门文章

  1. c语言代码大全_从学生到专家,C语言开发必读的8本书
  2. gihosoft android 教程,Gihosoft Free Android Data Recovery
  3. 泰山200机架服务器包含哪些型号_数据中心机房建设中的关键问题都有哪些?
  4. 服务器日志显示意外关闭,服务器事件日志
  5. php高效下载文件,LinkCache
  6. java expextion_Java(20~24)
  7. 不显示参数名_Houdini自定义参数Folder的几种模式
  8. java发送焦点做移键值_xiaoguozi's Blog
  9. 深圳php就业,传智播客深圳校区PHP04期毕业15个工作日就业率67.74%
  10. java上传永久图文素材_Java-微信开发上传永久素材(支持所有文件类型)