网络属性设置函数 setsockopt (设置绑定地址快速重用)

news2025/1/12 18:09:43

setsockopt 函数可以设置应用层、传输层、网络层的一些属性,比如

  • 应用层:绑定地址快速重用、允许广播、
  • 传输层:设置TCP最大数据段大小
  • 网络层:设置IP首部选项、服务类型、生存时间

         目录

1、setsockopt 参数和返回值解析

2、使用setsockopt 函数设置网络属性

(1) 绑定地址快速重用

(2) 允许广播

(3) 设置接收超时时间


1、setsockopt 参数和返回值解析

setsockopt函数设置网络属性,是针对套接字的,因为服务端和客户端的TCP数据段大小、接收缓冲区大小是可以不一样的。

第一个参数 sockfd你要设置哪个套接字的网络属性

第二个参数 level:你要设置哪一层的网络属性。上面提到,你可以设置应用层、传输层、网络层等三层的网络属性。这三层对应的可选值如下:

可选值含义
SOL_SOCKET应用层
IPPRO_TCP传输层
IPPROTO_IP网络层

第三个参数 optname:在选好第二个参数的基础上,要设置该层的哪个属性。

        如果第二个参数是 SOL_SOCKET, 可选值如下。因为第三个参数是void* 类型,所以填入的数据类型有多种,其中比较容易混淆的是 int 类型

  • 比如 SO_REUSERADDR,这里的int类型相当于一个bool类型,0代表false,1代表true
  • 比如 SO_RCVBUF,因为是要设置缓冲区大小,所以这里的int类型就代表要设置的字节数
可选值含义数据类型

SO_REUSEADDR

允许重用本地地址和端口int

SO_BROADCAST

允许发送广播数据int
SO_RCVTIMEO设置接收超时时间

struct timeval

(定义放在表格末尾)

SO_SNDTIMEO设置发送超时时间

struct timeval

(定义放在表格末尾)

SO_RCVBUF接收缓冲区大小int
SO_SNDBUF发送缓冲区大小int
SO_RCVLOWAT接收缓冲区下限int
SO_SNDLOWAT发送缓冲区下限int
SO_KEEPALIVE保持连接int
SO_DEBUG允许调试int
SO_DONTROUTE不查找路由int
SO_LINGER延迟关闭连接struct linger
SO_OOBINLINE带外数据放入正常数据流int
struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

        如果第二个参数是  IPPRO_TCP,可选值如下:

可选值含义数据类型
TCP_MAXSEGTCP最大数据段的大小 int
TCP_NODELAY不使用Nagle算法int

        如果第二个参数是 IPPROTO_IP,可选值如下:

可选值含义数据类型
IP_HDRINCL在数据包中包含IP首部int
IP_OPTIONS

IP首部选项

int
IP_TTL生存时间int

第四个参数 optlen:第三个参数对应的数据类型所占字节数。如果第三个参数填入的是int 类型,第四个参数就填 sizeof(int)

返回值:成功返回 0,失败返回 -1

2、使用setsockopt 函数设置网络属性

(1) 绑定地址快速重用

我们在运行服务端的时候,如果进程直接中断(比如收到了Ctrl+C发送了进程终止信号),此时没有正常完成四次挥手,服务端会进入close_wait状态,这个状态会持续两分钟左右。

这个时候如果我们重新运行服务端,bind函数会调用失败,因为上一次的服务端尽管处在close_wait状态,但依然在占用IP地址和端口号。为了不让服务端继续占用,我们可以将套接字的网络属性设为重用状态,表示上一个服务端就继续等吧,但是别占用资源。

int b_reuse = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &b_reuse, sizeof(int));

(2) 允许广播

int b_br = 1;
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &b_br, sizeof(int));

(3) 设置接收超时时间

struct timeval tout;
tout.tv_sec = 5;
tout.tv_usec = 0;
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &tout, sizeof(struct timeval));

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

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

相关文章

重点| 系统集成项目管理工程师考前50个知识点(3)

本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 19、项目管理计划的主要内容: &…

RNN--学习笔记

RNN引入“记忆”的概念,即输出需要依赖于之前的输入序列,并把关键输入记住。循环2字来源于其每个元素都执行相同的任务;并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来存储之前时间步的信息。不同类型的RNN:One…

SpringBoot的自动配置原理

目录 一、关于SpringBoot的启动原理 二、源码分析 SpringBootConfiguration ComponentScan EnableAutoConfiguration Import(AutoConfigurationImportSelector.class) AutoConfigurationPackage 三、总结 一、引言 要理解SpringBoot自动配置原理,首先要从S…

java计算机毕业设计ssm校园二手平台交易系统11w7i(附源码、数据库)

java计算机毕业设计ssm校园二手平台交易系统11w7i(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

【计算机视觉】Deep SORT多目标跟踪算法讲解(图文解释 超详细)

觉得有帮助请点赞关注收藏~~~ 一、目标跟踪简介 目标跟踪算法可以进行轨迹特征的分析和提取,以弥补目标检测的不足;有效地去除误检,提高检测精度,为进一步的行为分析提供基础。例如,在自动驾驶系统中,目标跟…

4 - 线程池 Java内置的线程池 - ScheduledExecutorService

ScheduledExecutorService ScheduledExecutorService是ExecutorService的子接口,具备了延迟运行或定期执行任务的能力。 1、常用获取方式 (注:还是通过 Executors. 的方式进行调用) 1)static ScheduledExecutorSer…

5702开发板用户手册

一、 底板简介 1.1 产品简介 在这里,对这款 MP5702 开发板底板进行简单的功能介绍。本公司相关核心板都可与其对接,型号如 MP5652(请详见用户手册)。底板核心板的模式来设计组成完整的开发。底板和核心板之间使用高速板间连接器连…

EMCC 中 运用SQL 优化的建议

1. 性能中心 关于SQL的执行信息 2. 优化SQL: ------整个过程SQL 实现---------------------- DECLARE my_task_name VARCHAR2(30); my_sqltext CLOB; BEGIN my_sqltext : SELECT * || FROM sales || WHERE prod_id 10 AND || cust_id …

Android穿戴设备新功能Compose for Wear OS 1.1

Todoist的增长率提高了50%,因为为Wear 3和Outdooractive重建了他们的应用程序,将开发时间缩短了30%,并显着提高了开发人员的生产力和更好的设计/开发人员协作: “Compose 使 UI 代码更易于编写和阅读,使我们能够在设计…

倍福:通过读取FB_EcCoESdoRead第三方伺服的COE参数,例如力矩等信息

本文介绍通过PLC读取第三方伺服的COE参数。例如力矩等信息 功能块介绍 首先需要用到的功能块为FB_EcCoESdoRead,该参数是读取COE online中的数据。PLC程序编写 首先扫描程序配置,并链接好NC变量如下所示然后再COEOnline中确定需要读取的变量的地址如下所示: 确定所在主站的…

shell 基本语法第一讲之(变量的使用、文件名替换和参数扩展、命令代换、算术代换、单引号、双引号)

1、变量的使用 #!/usr/sh #1、声明即赋值 注意:等号两边不能留空格,留了空格就编程一个命令两个参数 varNamename #2、使用变量 $varName ${varName}2、变量的分类 shell 内变量在shell的解析环境中存在的变量全局范围的变量(全局变量)shell中*不使用任何修饰符修…

【C++修炼之路】11. list类

每一个不曾起舞的日子都是对生命的辜负 list本节目标1. list的介绍及使用1.1 list的介绍1.2 list的使用1.3 模拟list节点的结构1.4 list类的封装补充:list的自带排序函数1. sort2. unique2. list的迭代器2.1 list的迭代器失效问题2.2 迭代器的分类2.3 迭代器的模拟实…

java基于Springboot的校园新闻网站-计算机毕业设计

项目介绍 本论文主要论述了如何使用JAVA语言开发一个校园新闻网站 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述校园新闻网站的当前背景以及系统开发的目的…

阿里全心打造,“Java核心精选宝册”助成长,面试实战一步到位

一、前言 接下来就是即将到来的金三银四了,这个时期是面试跳槽的高峰期,果不其然,有很多的朋友私信给我,询问我有没有对金三银四有帮助的一些笔记可以分享,所以就有了这篇文章,下面会大概的展示一下笔记的…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day12

大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。 不敢苟同,相信大…

论文投稿指南——中文核心期刊推荐(电子、通信技术3)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄🎈 核心期刊在国内的应用范围非常广,核心期刊发表很多是国内作者晋升中的硬性要求,在…

java计算机毕业设计ssm新文道考研机构在线教学辅导系统tjv50(附源码、数据库)

java计算机毕业设计ssm新文道考研机构在线教学辅导系统tjv50(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都…

Zebec获BNB Chain生态大力支持,ZBC通证将陆续登录一线平台

在行业早期开始,流支付赛道就已经具备了早期的轮廓,而在流支付协议Zebec Protocol出现后,该领域被推向了一个新的发展高度,并得到加密领域以及传统商业领域的高度关注。而随着生态的商业进展不断推进、生态不断壮大,Ze…

解决 PHPMYADMIN 无法导入大数据库文件方法

有个运营多年的海外站点需要搬迁服务器,备份好数据库后,通过 phpmyAdmin 面板导入数据库时发现有文件大小限制,最大导入 100M 的数据库文件,自己的数据库备份文件足足有 175M,平时都是通过 Navicat 导入也没注意,刚好遇见问题那么就选择解决问题。 解决方法 1、在 phpM…

docker构建vue项目镜像并发布到dockerhub中使用

先将本地vue项目打包为一个镜像,不会的可以看文章:使用docker构建vue项目并成功运行在本地和线上_1024小神的博客-CSDN博客 然后开始注册一个dockerhub账号并登陆:然后点击 create repository Docker Hub 开始填写仓库名称和描述&#xff1…