当前位置: 首页 > news >正文

[C++ 网络协议] 套接字的多种可选项

目录

1. 套接字的可选项

2. 获取/设置套接字可选项

2.1 getsockopt函数(获取套接字可选项)

2.2 setsockopt函数(设置套接字可选项)

3. 常用套接字可选项

3.1 SOL_SOCKET协议层的SO_TYPE可选项

3.2 SOL_SOCKET协议层的SO_SNDBUF和SO_RCVBUF可选项

3.3 SOL_SOCKET协议层的SO_REUSEADDR可选项

3.3.1 Time-wait状态

3.3.2 SO_REUSEADDR可选项

3.4 IPPROTO_TCP协议层的TCP_NODELAY可选项

3.4.1 Nagle算法

3.4.2 TCP_NODELAY可选项


1. 套接字的可选项

SOL_SOCKET:是套接字相关的通用可选项。

IPPROTO_IP:是IP协议相关事项。

IPPROTO_TCP:是TCP协议相关的事项。

无需全部记忆下来,只有一些是常用的,下面将会介绍。

2. 获取/设置套接字可选项

2.1 getsockopt函数(获取套接字可选项)

LINUX:
#include<sys/socket.h>int getsockopt(
int sock,                //用于查看选项套接字文件描述符
int level,               //要查看的可选项的协议层
int optname,             //要查看的可选项名
void* optval,            //保存查看结果的缓冲地址值
socklen_t* optlen        //向第四个参数optval传递的缓冲大小,即第四个参数所占字节数
);
成功返回0,失败返回-1WINDOWS:
#include<winsock2.h>int getsockopt(
SOCKET sock,              //同上    
int level,                //同上
int optname,              //同上
char* optval,             //同上,不同的是,这里是char* 类型要进行强制转换
int* optlen               //同上,不同的是,这里是int* 类型
);
成功返回0,失败返回SOCKET_ERROR

2.2 setsockopt函数(设置套接字可选项)

LINUX:
#include<sys/socket.h>int setsockopt(
int sock,            //用于更改可选项的套接字文件描述符
int level,           //要更改的可选项协议层
int optname,         //要更改的可选项名
const void* optval,  //保存要更改的选项信息的缓冲地址值
socklen_t optlen     //向第四个参数optval传递的可选项信息的字节数
);
成功返回0,失败返回-1WINDOWS:
#include<winsock2.h>int setsockopt(
int sock,            //同上
int level,           //同上
int optname,         //同上
const char* optval,  //同上,不同的是这里是const char* 类型
int optlen           //同上,不同的是这里是int 类型
);
成功返回0,失败返回SOCKET_ERROR

3. 常用套接字可选项

3.1 SOL_SOCKET协议层的SO_TYPE可选项

作用:用以查看套接字类型。如果是TCP套接字则为1(SOCK_STREAM),UDP套接字则为2(SOCK_DGRAM)。

注意:套接字类型不可更改,只能在创建时决定,由表也可得知。

3.2 SOL_SOCKET协议层的SO_SNDBUF和SO_RCVBUF可选项

作用:用以查看/修改输入/输出缓冲区大小。

注意:当你修改完后的I/O缓冲区大小,可能不是和你设置的结果一样,这是因为,缓冲区的大小设置要谨慎处理,不会完全按我们的要求进行,我们只是向系统传递要求,系统不一定会按照我们的结果来设置

3.3 SOL_SOCKET协议层的SO_REUSEADDR可选项

3.3.1 Time-wait状态

在了解SO_REUSEADDR可选项之前,先介绍套接字的Time_wait状态。

Time_wait状态:就是当某一方向另一方发起断开连接请求时,经过四次握手状态,请求断开连接的这一方在接收到另一方发来的FIN信息时,就会进入到一个Time-wait状态,等状态结束,才会关闭套接字,在这个期间,端口是一直处在运行状态,不能绑定其它套接字。

如图所示,只有先请求断开的这一方,才会经过Time-wait状态

所以,假设服务器端是先请求断开的这一方,那么服务器端在与客户端进行四次握手后,进入到Time-wait状态,这时,服务器端不能马上重新运行,因为下次运行,进行IP地址和端口号绑定时,bind函数会发生错误,因为此时套接字还处于Time-wait状态,端口号仍然在使用中,所以服务器不能马上重新运行。

1.客户端套接字为什么先请求断开,重启后仍然可以立马运行?

因为:客户端的端口是动态分配的,并不是固定的。

2.客户端套接字会不会经过Time-wait状态?

答:会的,只要是先请求断开的这一方的套接字,都会经过Time-wait状态。

3.为什么会有Time-wait这个状态?

答:假设上述图中,主机A在发送完最后一个数据包后,马上关闭套接字,而最后一个数据包并没有送达到主机B,那么此时主机B就会认为前一个数据包发送给了主机A,而主机A没有收到,就会把前一个主机包进行重传,但是,主机A却再也不能接收到这个数据包了,因为主机A已经在发送最后一个数据包的同时把套接字给关闭了。基于这些考虑,才会有Time-wait状态。

3.3.2 SO_REUSEADDR可选项

Time-wait状态,看起来很重要,但并不是那么让人喜欢。当系统发生故障紧急停止时,需要立马重启服务器端,提供服务,这时,因为服务器端的套接字处于Time-wait状态,从而导致,必须要等待几分钟。如图:

此时,服务器端每接收到主机B发来的数据包,Time-wait状态就会进行重置,服务器端就必须要等待状态结束。

所以,我们提供SO_REUSEADDR可选项,来设置套接字。

作用:调整参数,将允许处于Time-wait状态的套接字绑定的端口号,绑定新的套接字。

值:默认值是0(假),不允许Time-wait状态的套接字的端口号绑定新的套接字,设置为1(真),将允许绑定新的套接字

3.4 IPPROTO_TCP协议层的TCP_NODELAY可选项

3.4.1 Nagle算法

在了解TCP_NODELAY可选项的作用之前,先了解Nagle算法。

Nagle算法优点:防止因数据包过多而发生的网络过载

Nagle算法缺点:因要等待ACK消息,传输速率会降低

Nagle算法原理:只有收到前一数据的ACK消息时,才发送下一数据。如图:

主机A发送字符串"Nagle"到主机B。

左边,当开启了Nagle算法时,主机A会先将头字符N存入输出缓冲中,这时因为N是头字符,没有需要接收的ACK,所以会立马传输给主机B,接着主机A等待主机B的ACK,在等待的同时,会将余下的字符存入输出缓冲里,在接收到主机B的ACK消息后,把余下字符装入一个数据包发送给主机B。这时,总共只传递了4个数据包

右边,当关闭了Nagle算法时,极端情况下(并不是说关闭Nagle算法一定是这么传输的),主机A有可能会逐个字符依次传到输出缓冲里,因为无需等待主机B的ACK,在存入输出缓冲里,就马上传输给主机B。这样,总共传递了10个数据包

综上,Nagle算法可以防止数据包过多而导致的网络过载。

Nagle算法在什么情况下适用,什么情况下不适用?

答:要根据传输数据的特性来,网络流量未受太大影响时,不使用Nagle算法要更快。比如:大文件数据的传输,这时即便不使用Nagle算法也会在装满输出缓冲时再进行传输,这样不仅不会增加数据包的数量,反而因为不用接收ACK,而提高传输速度。

3.4.2 TCP_NODELAY可选项

我们可以通过TCP_NODELAY来禁用Nagle算法。

作用:启用/禁用Nagle算法

值:默认值是0(假)启用Nagle算法,1(真)禁用Nagle算法

相关文章:

[C++ 网络协议] 套接字的多种可选项

目录 1. 套接字的可选项 2. 获取/设置套接字可选项 2.1 getsockopt函数&#xff08;获取套接字可选项&#xff09; 2.2 setsockopt函数&#xff08;设置套接字可选项&#xff09; 3. 常用套接字可选项 3.1 SOL_SOCKET协议层的SO_TYPE可选项 3.2 SOL_SOCKET协议层的SO_SN…...

2022年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字变换 给定一个包含 5 个数字(0-9)的字符串, 例如 “02943”, 请将“12345”变换到它。 你可以采取 3 种操作进行变换 (1)交换相邻的两个数字 (2)将一个数字加 1。 如果加 1 后大于 9, 则变为 0 (3)将一个数字加倍。 如果加倍后大于 9,则将其变为加倍后的…...

***数据转换中常用的两个函数 sscanf,sprintf

1、sscanf将字符串转换成想要的整数或浮点数 (HMI屏中输入浮点数据,到mcu后要转换成对应的浮点数据) sscanf(“0.9”,“%f”,getData) /*! \brief 文本控件通知 \details 当文本通过键盘更新(或调用GetControlValue)时,执行此函数 \details 文本控件的内容以字符串形…...

软件工程(十九) 软件测试

软件测试主要了解软件测试的方法和软件的调试。 1、软件测试方法 1.1、测试基本思想 尽早、不断的进行测试 在V模型其实已经凸显出这种思想了程序员避免测试自己设计的程序 因为测试自己设计的程序,其实是不容易发现问题的,因为人从本质上都不愿意找自己的茬。而且由于你的…...

go中读写锁(rwmutex)源码解读实现原理

go读写锁的实现原理 1、RWMutex读写锁的概念 读写锁也就是我们所使用的RWMutex&#xff0c;其实是对于go本身的mutex做的一个拓展&#xff0c;当一个goroutine获得了读锁后&#xff0c;其他goroutine同样可以获得读锁&#xff0c;但是不能获得写锁。相反&#xff0c;当一个go…...

【人工智能】—_深度优先搜索、代价一致搜索、深度有限搜索、迭代深度优先搜索、图搜索

【人工智能】无信息搜索—BFS 、代价一致、DFS、深度受限、迭代深入深度优先、图搜索 什么是搜索 搜索问题是指既不能通过数学建模解决&#xff0c;又没有其他算法可以套用或者非遍历所有情况才能得出正确结果。这时就需要采用搜索算法来解决问题。搜索就是一种通过穷举所有解…...

uni-app 客服按钮可上下拖动动

项目需求&#xff1a; 因为悬浮客服有时候会遮挡住界面内容&#xff0c;故需要对悬浮的气泡弹窗做可拖动操作 movable-area&#xff1a;可拖动区域 movable-view&#xff1a;可移动的视图容器&#xff0c;在页面中可以拖拽滑动或双指缩放。 属性说明 属性名类型默认值说…...

基于Android的旅游管理系统 微信小程序

随着网络科技的发展&#xff0c;移动智能终端逐渐走进人们的视线&#xff0c;相关应用越来越广泛&#xff0c;并在人们的日常生活中扮演着越来越重要的角色。因此&#xff0c;关键应用程序的开发成为影响移动智能终端普及的重要因素&#xff0c;设计并开发实用、方便的应用程序…...

python-数据可视化-下载数据-CSV文件格式

数据以两种常见格式存储&#xff1a;CSV和JSON CSV文件格式 comma-separated values import csv filename sitka_weather_07-2018_simple.csv with open(filename) as f:reader csv.reader(f)header_row next(reader)print(header_row) # [USW00025333, SITKA AIRPORT, A…...

时序预测 | MATLAB实现SSA-XGBoost(麻雀算法优化极限梯度提升树)时间序列预测

时序预测 | MATLAB实现SSA-XGBoost(麻雀算法优化极限梯度提升树)时间序列预测 目录 时序预测 | MATLAB实现SSA-XGBoost(麻雀算法优化极限梯度提升树)时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 Matlab实现SSA-XGBoost时间序列预测&#xff0c;麻…...

leetcode 823 带因子的二叉树

用动态规划 如果两个节点值不同,要乘2&#xff0c;因为两个节点可以互换位置 dp[i] dp[left] * dp[right] * 2 如果相同 dp[i] dp[left] * dp[right] class Solution {public int numFactoredBinaryTrees(int[] arr) {Arrays.sort(arr);int n arr.length;long[] dp ne…...

钉钉消息已读、未读咋实现的嘞?

前言 一款app&#xff0c;消息页面有&#xff1a;钱包通知、最近访客等各种通知类别&#xff0c;每个类别可能有新的通知消息&#xff0c;实现已读、未读功能&#xff0c;包括多少个未读&#xff0c;这个是怎么实现的呢&#xff1f;比如用户A访问了用户B的主页&#xff0c;难道…...

Java 读取TIFF JPEG GIF PNG PDF

Java 读取TIFF JPEG GIF PNG PDF 本文解决方法基于开源 tesseract 下载适合自己系统版本的tesseract &#xff0c;官网链接&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 2. 下载之后安装&#xff0c;安装的时候选择选择语言包&#xff0c;我选择了中文和英文 3.…...

研磨设计模式day14模板方法模式

目录 场景 原有逻辑 有何问题 解决方案 解决思路 代码实现 重写示例 模板方法的优缺点 模板方法的本质 何时选用 场景 现在模拟一个场景&#xff0c;两个人要登录一个系统&#xff0c;一个是管理员一个是用户&#xff0c;这两个不同身份的登录是由后端对应的两个接…...

7 集群基本测试

1. 上传小文件到集群 在hadoop路径下执行命令创建一个文件夹用于存放即将上传的文件&#xff1a; [atguiguhadoop102 ~]$ hadoop fs -mkdir /input上传&#xff1a; [atguiguhadoop102 hadoop-3.1.3]$ hadoop fs -put wcinput/work.txt /input2.上传大文件 [atguiguhadoop1…...

chrono学习(一)

我想用chrono进行沙土的仿真&#xff0c;首先学习demo_GPU_ballCosim.cpp&#xff0c;这个例子仿真了一些沙土的沉降过程。 首先&#xff0c;运行编辑完成的文件demo_GPU_ballCosim&#xff1a; (base) eowyneowyn-MS-7D20:~/build_chrono/bin$ ./demo_GPU_ballCosim 运行完得…...

后端面试话术集锦第 十 篇:springMVC面试话术

这是后端面试集锦第十篇博文——springMVC面试话术❗❗❗ 1. 介绍一下springMVC springmvc是一个视图层框架,通过MVC模型让我们很方便的接收和处理请求和响应。 我给你说说他里边的几个核心组件吧: 它的核心控制器是DispatcherServlet,他的作用是接收用户请求,然后给用户…...

基于Django 框架搭建的机器学习在线平台源代码+数据库,实现KNN、ID3、C4.5、SVM、朴素贝叶斯、BP神经网络等算法及流程管理

结果展示&#xff08;Kmeans&#xff09;&#xff1a; 完整代码下载地址&#xff1a;基于Django 框架搭建的机器学习在线平台源代码数据库 python机器学习之 K-邻近算法 简单的理解&#xff1a;[ 采用测量不同特征值之间的距离方法进行分类 ] 优点 &#xff1a;精度高、对异常…...

大数据组件-Flume集群环境搭建

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…...

想系列服务迁移专有云效实操

想系列服务迁移专有云效实操 1注册应用 查看jenkins脚本是否需要修改代码编译路径 gemdale_jenkins/maven3-service/k8s-image/maven3-service-deploy.sh Jenkins上的打包路径 service_tgt_path s e r v i c e w s / t a r g e t / service_ws/target/ servicew​s/target/ser…...

自动驾驶小白必看:航向角、偏航角、前轮转角到底有什么区别?

自动驾驶入门&#xff1a;航向角、偏航角与前轮转角的本质差异与应用解析 刚接触自动驾驶技术时&#xff0c;最让人困惑的莫过于那些描述车辆方向的专业术语——航向角、偏航角、前轮转角&#xff0c;它们看起来相似却又各有所指。理解这些概念不仅是掌握车辆控制的基础&#…...

DataQA数问增长:金融小贷行业的“智能风控大脑“实战揭秘

数问"Web渠道转化率仅0.2&#xff0c;欺诈风险高、客户资质差——你的渠道投放预算&#xff0c;有多少正在打水漂&#xff1f;" &#x1f4a1; 真实场景还原&#xff1a;某头部消费金融公司的渠道危机 时间&#xff1a;2026年3月&#xff0c;周一上午9:00 角色&…...

零基础玩转AI绘画:WuliArt Qwen-Image Turbo快速入门指南

零基础玩转AI绘画&#xff1a;WuliArt Qwen-Image Turbo快速入门指南 1. 为什么选择WuliArt Qwen-Image Turbo&#xff1f; AI绘画领域近年来发展迅猛&#xff0c;但对于普通用户而言&#xff0c;最大的痛点不是模型能力不足&#xff0c;而是难以在个人设备上稳定运行。WuliA…...

鸿蒙 ArkTS 高级样式复用:@Extend 装饰器完全解析(比 @Styles 更强大)

&#x1f525;前言&#xff1a;在上一篇文章《鸿蒙 ArkTS 样式复用&#xff1a;Styles 装饰器从入门到实战》中&#xff0c;我们学习了使用 Styles 实现基础样式复用。 但 Styles 不支持传参、不能使用组件专有属性&#xff0c;在复杂 UI 场景下能力有限。 &#x1f4cc; 本文…...

3步实现视频硬字幕精准提取:本地化多语言解决方案如何解决你的字幕难题

3步实现视频硬字幕精准提取&#xff1a;本地化多语言解决方案如何解决你的字幕难题 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区…...

Pixel Couplet Gen实操手册:自定义门神像素图替换与SVG动画扩展方法

Pixel Couplet Gen实操手册&#xff1a;自定义门神像素图替换与SVG动画扩展方法 1. 项目概述 Pixel Couplet Gen是一款融合传统春节元素与现代像素艺术风格的AI春联生成工具。通过ModelScope大模型的文本生成能力&#xff0c;结合精心设计的8-bit视觉风格&#xff0c;为用户提…...

告别插件!保姆级教程:用Nginx反向代理搞定海康威视Web无插件视频预览

海康威视Web无插件视频预览的Nginx反向代理实战指南 引言 在现代安防监控系统集成中&#xff0c;海康威视设备因其稳定性和广泛兼容性成为行业首选。然而&#xff0c;传统Web集成方案往往依赖浏览器插件&#xff0c;这不仅增加了部署复杂度&#xff0c;也带来了安全风险。随着H…...

SENet实战:如何在PyTorch中实现Squeeze-and-Excitation模块(附完整代码)

PyTorch实战&#xff1a;手把手实现SENet中的SE模块 在计算机视觉领域&#xff0c;注意力机制已经成为提升模型性能的重要工具。今天我们将深入探讨如何在PyTorch中实现Squeeze-and-Excitation&#xff08;SE&#xff09;模块——这个让ResNet-50在ImageNet上表现接近ResNet-10…...

STM32CubeIDE用DAP下载器?这份OpenOCD配置文件修改与复位难题解决指南请收好

STM32CubeIDE深度调优&#xff1a;DAP下载器OpenOCD配置与自动复位难题实战解析 当你在STM32CubeIDE中切换ST-LINK与DAP调试器时&#xff0c;是否注意到两者在用户体验上的显著差异&#xff1f;特别是当使用DAP调试器时&#xff0c;每次下载后都需要手动复位开发板才能运行程序…...

Google 地图事件:探索、挑战与未来展望

Google 地图事件:探索、挑战与未来展望 引言 Google 地图作为全球最受欢迎的地图服务之一,自2005年推出以来,已经深入到人们生活的方方面面。然而,在这段时间里,Google 地图也经历了一系列事件,包括技术挑战、政策争议以及市场竞争等。本文将围绕这些事件,对 Google 地…...