SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。默认情况下,当我们使用close系统调用来关闭一个socket时,close将立即返回,TCP模块负责把该socket对应的TCP发送缓冲区中残留的数据发送给对方。

设置(获取)SO_LINGER选项的值时,我们需要给setsockopt(getsockopt)系统调用传递一个linger类型的结构体,其定义如下:

#include <sys/socket.h>
struct linger
{int l_onoff;// 开启(非0)还是关闭(0)该选项int l_linger;// 滞留时间
};

根据linger结构体中两个成员变量的不同值,close系统调用可能产生如下3种行为之一:

l_onoff等于0(关闭):此时SO_LINGER选项不起作用,close用默认行为来关闭socket。

l_onoff不为0(开启),l_linger等于0:此时close系统调用立即返回,TCP模块将丢弃被关闭的socket对应的TCP发送缓冲区中残留的数据,同时给对方发送一个复位报文段(RST)。因此,这种情况给服务器提供了异常终止一个连接的方法。

l_onoff不为0(开启),l_linger大于0:此时close的行为取决于两个条件:一是被关闭的socket对应的TCP发送缓冲区是否还有残留的数据;二是该socket是阻塞的,还是非阻塞的。对于阻塞的socket,close将等待一段长为l_linger的时间,直到TCP模块发送完所有残留数据并得到对方的确认。如果这段时间内TCP模块没有发送完残留数据并得到对方的确认,那么close系统调用将返回-1并设置errno为EWOULDBLOCK。如果socket是非阻塞的,close将立即返回,此时我们需要根据其返回值和errno来判断残留数据是否已经发送完毕。

SO_LINGER选项相关推荐

  1. java网络编程Socket中SO_LINGER选项的用法解读

    http://blog.sina.com.cn/s/blog_6b1990eb0101171o.html 1:设置该选项: public void setSoLinger(boolean on, in ...

  2. 套接字选项SO_LINGER

    在说明套接字选项SO_LINGER之前,我们来先看一个问题.如果发送缓冲区中还有数据没有发送到对方协议栈,此时close发送端的socket会发生什么,下面代码给出答案. 服务端: #include ...

  3. Linux下高性能网络编程中的几个TCP/IP选项_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE

    最近在新的平台上测试程序,以前一些没有注意到的问题都成为了性能瓶颈,通过设置一些TCP/IP选项能够解决一部分问题,当然根本的解决方法是重构代码,重新设计服务器框架.先列出几个TCP/IP选项: 选项 ...

  4. tcp 选项:SO_LINGER祥解(转)

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

  5. Socket/ServerSocket 选项

    Socket/ServerSocket 选项 原文:Socket/ServerSocket 选项 在网络编程中,Socket/ServerSocket有一些选项用来自定义一些行为,现在分享一下. So ...

  6. linux 套接字选项定义

    2019独角兽企业重金招聘Python工程师标准>>> linux 套接字选项定义 2011-07-28 14:31 1.closesocket(一般不会立即关闭而经历TIME_WA ...

  7. Socket编程中的强制关闭与优雅关闭及相关socket选项

    以下描述主要是针对windows平台下的TCP socket而言. 首先需要区分一下关闭socket和关闭TCP连接的区别,关闭TCP连接是指TCP协议层的东西,就是两个TCP端之间交换了一些协议包( ...

  8. 网络编程学习笔记(基本套接口选项)

    SO_BROADCAST套接口选项: 此选项使能或禁止进程发送广播消息的能力.只有数据报套接口支持广播,并且还必须是在支持广播消息的网络上(例如以太网.令牌网).不能在一个点对点链路上进行广播. SO ...

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

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

  10. 异步socket优雅的关闭-CancelIO和SO_LINGER

    我们在利用IOCP(完成端口)进行程序设计的时候,经常要关闭一些不满足条件的套接字.假如我们直接采用closesocket方法进行关闭的话,绑定到IO端口的此套接字的未发送的数据就会丢失,这种情况是我 ...

最新文章

  1. 浅浅认识之VBS脚本访问接口与COMODO拦截COM接口
  2. Linux中使用gcp拷贝报错:dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported:
  3. OpenCV C++ 05 - Change Contrast
  4. Ulua_toLua_基本案例(八)_LuaAccessingArray
  5. java开启新线程的三种方法
  6. php 获取当前页面url_PHP获取URL –如何获取当前页面的完整URL
  7. vue 如何处理两个组件异步问题_Vue异步组件使用详解
  8. PHP转换时间戳mktime,php日期转换为时间戳的方法
  9. vsftpd系统用户配置详解
  10. html 字体图标大小,CSS ICONFONT 基线和大小问题
  11. Vitis下Linux应用程序开发流程
  12. LayUI⑷:模板语法
  13. HTML标签--换行标签与段落标签的区别对比
  14. 领导者应具备的三个能力
  15. linux下的串口编程
  16. 10-webrtc实现1V1音视频实时互动直播系统
  17. jmeter简单的接口请求
  18. 咸鱼硬件—ZTMS开发板固件安装
  19. JavaScript中的参数传递
  20. Rapid object detection using a boosted cascade of simple features-简译

热门文章

  1. 深入分析.NET应用程序SQL注入【危害】
  2. 1.Docker技术入门与实战 --- 初识Docker与容器
  3. 8.Shell 编程从入门到精通 --- 文本处理利器 awk
  4. 40. MySQL的权限与安全
  5. 8.网页找不到服务器
  6. 48.自定义邮件模板
  7. 5. MVC,MVP 和 MVVM
  8. [2019徐州网络赛J题]Random Access Iterator
  9. 08flask中get和post请求。
  10. Python自动化中的元素定位xpath(二)