Linux网络 -- TCP FIN包发送超时时间设置

使用 SO_LINGER 选项控制FIN包发送的超时时间

技术背景

在TCP连接中,当应用程序调用 closeshutdown 函数关闭一个socket时,操作系统内核会发送一个FIN包以通知对端连接即将关闭。默认情况下,内核会等待所有未发送的数据发送完毕后再发送FIN包。然而,有时候我们希望在一定的时间内强制关闭连接,即使未发送的数据尚未发送完毕。这时候可以使用 SO_LINGER 选项来实现。

技术的实现原理

SO_LINGER 选项允许我们设置一个超时时间,当我们调用 closeshutdown 函数时,内核会在这个超时时间内尝试发送所有未发送的数据和FIN包。如果在超时时间内未能完成发送,连接将被强制关闭。

实现步骤

下面是使用 SO_LINGER 选项的具体步骤:

  1. 引入必要的头文件:

    #include <sys/socket.h>
    #include <netinet/in.h>
    
  2. 创建一个 linger 结构体变量,并设置相关参数:

    struct linger linger_option;
    linger_option.l_onoff = 1;   // 启用SO_LINGER选项
    linger_option.l_linger = 10; // 设置超时时间为10秒
    
  3. 使用 setsockopt 函数为socket设置 SO_LINGER 选项:

    setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger_option, sizeof(linger_option));
    

完整的代码示例如下:

#include <sys/socket.h>
#include <netinet/in.h>int main() {int sock = socket(AF_INET, SOCK_STREAM, 0);if (sock == -1) {// 处理错误}struct linger linger_option;linger_option.l_onoff = 1;   // 启用SO_LINGER选项linger_option.l_linger = 10; // 设置超时时间为10秒if (setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger_option, sizeof(linger_option)) < 0) {// 处理错误}// 使用socket进行通信close(sock); // 关闭socket,触发SO_LINGER选项return 0;
}

在上面的代码中,当调用 close(sock) 时,内核会等待最多10秒钟来发送未发送的数据和FIN包。如果在10秒钟内完成了发送,连接将正常关闭;否则,连接将被强制关闭。

注意事项

  • 设置 SO_LINGER 选项后,如果超时时间设置为0,则连接将立即关闭,不会等待未发送的数据。
  • SO_LINGER 选项的行为依赖于操作系统的实现,可能会因不同的操作系统而有所差异。
  • 使用 SO_LINGER 选项可能会影响网络性能,需要根据实际需求进行测试和调整。

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

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

相关文章

使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试》&#xff08;作者&#xff1a;尚雷&#xff09;&#xff0c…

PHP宠物店萌宠小程序系统源码

&#x1f43e;萌宠生活新方式&#x1f43e; &#x1f3e1;【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店&#xff1f;现在&#xff0c;“宠物店萌宠小程序”就是你的秘密花园&#xff01;&#x1f31f;只需轻轻一点&#xff0c;就能瞬…

什么是股指期货交割?股指期货交割的例子

股指期货交割是指在股指期货合约到期时&#xff0c;投资者需要按照合约规定完成的结算过程。与一般的商品期货、国债期货或外汇期货不同&#xff0c;股指期货采用的是现金交割方式。 股指期货交割的方式 【现金交割】股指期货的交割不需要实际交割一篮子股票指数成分股。相反…

(社恐福音)用python写一个定时弹窗功能

背景 背景是换了一个工作&#xff0c;需要点外卖了 写代码太认真的时候又经常忘记 这时候就需要一个闹钟 手机闹钟声音太大 会影响他人 所以用python 写一个弹窗功能&#xff0c;只影响自己 效果图 原理 管理列表和定时功能通过windows自带的计划完成 python程序不用占用后台…

js中! 、!!、?.、??、??=的用法及使用场景

js中! 、 !. 、!、?.、.?、??、??的用法及使用场景 !!!?.??????、?? 区别 !. &#xff08;ts&#xff09;注意 ! (非空断言符号) 用于取反一个布尔值或将一个值转换为布尔类型并取反 const a true; const b false; const value !a; // false const value !…

https和http区别

1、安全性 HTTP信息是明文传输&#xff0c;而HTTPS则通过SSL/TLS协议进行加密传输&#xff0c;确保数据传输的安全性。HTTPS可以验证服务器身份&#xff0c;防止中间人攻击&#xff0c;保护数据的完整性和保密性。 2、端口号 HTTP默认使用80端口&#xff0c;而HTTPS默认使用…

最佳实践:设计思维:“6+1”迭代过程的创新实践丨IDCF

谢志萌 研发效能&#xff08;DevOps&#xff09;工程师&#xff08;中级&#xff09;认证学员 一、前言 “有效的Devops关键在于专注于人员和文化&#xff0c;而不仅仅是工具和技术。” -John Willis 随着数字化转型的加速&#xff0c;组织越来越依赖于快速、高效的软件交…

7月18日学习打卡,数据结构堆

hello大家好呀&#xff0c;本博客目的在于记录暑假学习打卡&#xff0c;后续会整理成一个专栏&#xff0c;主要打算在暑假学习完数据结构&#xff0c;因此会发一些相关的数据结构实现的博客和一些刷的题&#xff0c;个人学习使用&#xff0c;也希望大家多多支持&#xff0c;有不…

ARM架构(二)—— arm v7/v8/v9寄存器介绍

1、ARM v7寄存器 1.1 通用寄存器 V7 V8开始 FIQ个IRQ优先级一样&#xff0c; 通用寄存器&#xff1a;31个 1.2 程序状态寄存器 CPSR是程序状态毒存器&#xff0c;保存条件标志位&#xff0c;中断禁止位&#xff0c;当前处理器模式等控制和状态位。每种异常模式下还存在SPSR&…

《系统架构设计师教程(第2版)》第12章-信息系统架构设计理论与实践-02-信息系统架构

文章目录 1. 概述1.1 信息系统架构&#xff08;ISA&#xff09;1.2 架构风格 2. 信息系统架构分类2.1 信息系统物理结构2.1.1 集中式结构2.1.2 分布式结构 2.2 信息系统的逻辑结构1&#xff09;横向综合2&#xff09;纵向综合3&#xff09;纵横综合 3. 信息系统架构的一般原理4…

Pandas教程:近万字讲解在Pandas中如何操作Excel

目录 1. 安装与配置 2. 读取Excel文件 2.1 基本用法 2.2 指定工作表 2.3 指定单元格范围 3. 数据检查与预处理 3.1 查看数据的基本信息 3.2 数据类型检查与转换 3.3 检查缺失值 3.4 处理缺失值 4. 数据清洗与转换 4.1 重命名列 4.2 删除重复数据 4.3 数据替换 4…

Android使用ANativeWindow更新surfaceView内容最简Demo

SurfaceView简介 SurfaceView对比View的区别 安卓的普通VIew,都依赖于当前Activity的Window的surface&#xff0c;这个surface用于承载view树从底到顶绘制出来的所有内容&#xff0c;因此任何一个view需要更新时&#xff0c;都需要把所有view中底到顶进行更新&#xff0c;即使使…

解决:Linux上SVN 1.12版本以上无法直接存储明文密码

问题&#xff1a;今天在Linux机器上安装了SVN&#xff0c;作为客户端使用&#xff0c;首次执行SVN相关操作&#xff0c;输入账号密码信息后&#xff0c;后面再执行SVN相关操作&#xff08;比如"svn update"&#xff09;还是每次都需要输入密码。 回想以前在首次输入…

Python进阶(4)--正则表达式

正则表达式 在Python中&#xff0c;正则表达式&#xff08;Regular Expression&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;它允许你使用一种特殊的语法来匹配、查找、替换字符串中的文本。 在这之前&#xff0c;还记得之前我们是通过什么方法分割…

实习问题总结

为什么使用GRPC作为通信方式&#xff0c;对比如REST好处在哪里&#xff1f; 使用protobuf作为序列化格式&#xff0c;以二进制进行传输&#xff0c;减小了数据包的大小&#xff0c;效率高 proto强类型定义、支持复杂数据类型&#xff0c;编译运行可以进行严格的数据验证&#…

[论文笔记] pai-megatron-patch Qwen2-CT 长文本rope改yarn

更改: # Copyright (c) 2024 Alibaba PAI and Nvidia Megatron-LM Team. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License a…

【系统架构设计】数据库系统(二)

数据库系统&#xff08;二&#xff09; 数据库模式与范式数据库设计数据库设计的方法数据库设计的基本步骤 事务管理并发控制故障和恢复 备份与恢复分布式数据库系统数据仓库数据挖掘NoSQL大数据 数据库模式与范式 数据库设计 数据库设计的方法 目前已有的数据库设计方法可分…

element UI :el-table横向列内容超出宽度,滚动条不显示问题

是否能解决你问题的前提 **看到这篇文章的解决问题的方案之前&#xff0c;请先回忆你是否在项目中的全局样式或者私有组件中去单独设置过滚动条样式。如果有 请继续往下看&#xff1a;**单独设置过滚动条样式代码实例&#xff1a; ::-webkit-scrollbar {/*滚动条整体样式*/wi…

layui 让table里的下拉框不被遮挡

记录&#xff1a;layui 让table里的下拉框不被遮挡 /* 这个是让table里的下拉框不被遮挡 */ .goods_table .layui-select-title,.goods_table .layui-select-title input{line-height: 28px;height: 28px; }.goods_table .layui-table-cell {overflow: visible !important; }.…

H-Instructions Substring(牛客暑期第二场)

题意&#xff1a;刚开始red站在初始位置&#xff08;0&#xff0c;0&#xff09;&#xff0c;她有一串指令&#xff1a;向上&#xff0c;向下&#xff0c;向左&#xff0c;向右&#xff08;上将y&#xff0c;下将y--&#xff0c;左x--&#xff0c;右x&#xff09;,可以选择连续…