[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 getsocketopt(
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算法

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

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

相关文章

Qt6和Rust结合构建桌面应用

桌面应用程序是原生的、快速的、安全的&#xff0c;并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言&#xff0c;专注于安全性和性能&#xff0c;解决了 C/C 长期以来一直在努力解决的问题&#xff0c;例如内存错误和构建并发程序。 在桌面应用程序开…

AI + Milvus:将时尚应用搭建进行到底

在上一篇文章中&#xff0c;我们学习了如何利用人工智能技术&#xff08;例如开源 AI 向量数据库 Milvus 和 Hugging Face 模型&#xff09;寻找与自己穿搭风格相似的明星。在这篇文章中&#xff0c;我们将进一步介绍如何通过对上篇文章中的项目代码稍作修改&#xff0c;获得更…

Oracle数据库快速入门

前言&#xff1a; 我想现在很多人的入门数据库都是mysql&#xff0c;但是由于工作中会接触到Oracle数据库&#xff0c;如果你有MySQL的基础的话&#xff0c;这篇文章能让你很快掌握Oracle。 目录 1.体系结构 2.创建用户和表空间 2.1.创建表空间 2.2.创建用户 3.数据类型…

机器学习基础11-算法比较(基于印第安糖尿病Pima Indians 数据集)

比较不同算法的准确度&#xff0c;选择合适的算法&#xff0c;在处理机器学习的问题时是非常重要的。本节将介绍一种模式&#xff0c;在scikit-learn中可以利用它比较不同的算法&#xff0c;并选择合适的算法。你可以将这种模式作为自己的模板&#xff0c;来处理机器学习的问题…

微服务流程引擎:简单又灵活,实现流程全生命周期管理!

伴随着日益激烈的市场竞争&#xff0c;传统的办公操作已经无法满足发展需要了。如果采用微服务流程引擎加油助力&#xff0c;就可以帮助企业更好地管理数据资源&#xff0c;高效做好各种表单制作&#xff0c;实现高效率办公。流辰信息以市场为导向&#xff0c;用心钻研低代码技…

天翼物联、汕头电信与汕头大学共建新一代信息技术与数字创新(物联网)联合实验室

近日&#xff0c;在工业和信息化部和广东省人民政府共同主办的2023中国数字经济创新发展大会上&#xff0c;天翼物联、汕头电信与汕头大学共建“新一代信息技术与数字创新&#xff08;物联网&#xff09;”联合实验室签约仪式举行。汕头大学校长郝志峰、中国电信广东公司总经理…

[MyBatis系列④]核心配置文件

目录 1、简介 2、DTD 3、typeHandlers 3.1、默认类型处理器 3.2、自定义类型处理器 4、plugins ⭐MyBatis系列①&#xff1a;增删改查 ⭐MyBatis系列②&#xff1a;两种Dao开发方式 ⭐MyBatis系列③&#xff1a;动态SQL 1、简介 MyBatis的核心配置文件&#xff08;通常命…

3D WEB轻量化引擎HOOPS产品助力NAPA打造船舶设计软件平台

NAPA&#xff08;Naval Architectural PAckage&#xff0c;船舶建筑包&#xff09;&#xff0c;来自芬兰的船舶设计软件供应商&#xff0c;致力于提供世界领先的船舶设计、安全及运营的解决方案和数据分析服务。NAPA拥有超过30年的船舶设计经验&#xff0c;年营业额超过2560万欧…

Rspack 创建 vue2/3 项目接入 antdv(rspack.config.js 配置 less 主题)

一、简介 Rspack CLI 官方文档。 rspack.config.js 官方文档。 二、创建 vue 项目 创建项目&#xff08;文档中还提供了 Rspack 内置 monorepo 框架 Nx 的创建方式&#xff0c;根据需求进行选择&#xff09; # npm 方式 $ npm create rspacklatest# yarn 方式 $ yarn create…

Linux 终端命令之文件目录操作,对比Dos相关命令

目录 前言 基础命令&#xff08;文件目录相关的&#xff09; cd命令 【英文帮助】 【对应Dos命令】 pwd命令 【英文帮助】 【对应Dos命令】 ls命令 【英文帮助】 【对应Dos命令】 tree命令 【英文帮助】 【对应Dos命令】 mkdir命令 【英文帮助】 【对应Dos命令…

718. 最长重复子数组

718. 最长重复子数组 原题链接&#xff1a;完成情况&#xff1a;题解&#xff1a;方法一&#xff1a;动态规划方法二&#xff1a;滑动窗口方法三&#xff1a;二分查找 哈希 原题链接&#xff1a; 718. 最长重复子数组 https://leetcode.cn/problems/maximum-length-of-repe…

二甲医院信息管理系统源码 his系统源码 java+Angular+JavaScript

云HIS系统采用SaaS软件应用服务模式&#xff0c;提供软件应用服务多租户机制&#xff0c;实现一中心部署多机构使用。主要包含收费计费、药品管理、门诊医生工作站、住院医生工作站、护士工作站、数据统计、电子病历、医保接口等功能&#xff0c;能够满足医院及诊所日常业务开展…

人力资源小程序的设计方案与实现

随着互联网的发展&#xff0c;人才招聘已经成为许多企业的一项重要任务。为了提高招聘效率和便利求职者&#xff0c;许多企业开始采用小程序作为招聘平台。本文将为大家介绍一个搭建本地人才招聘网小程序的实用指南。 首先&#xff0c;我们需要登录【乔拓云】制作平台&#xff…

GNU-gcc编译选项-1

include目录 -I &#xff0c;比如: -I. -I ./Platform/include -I ./Platform/include/prototypes -I ./tpm/include -I ./tpm/include/prototypes -I ./Simulator/include -I ./Simulator/include/prototypes 编译选项 在GCC编译器中&#xff0c;-D是一个编译选项&…

基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v7.0版已发布

关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架&#xff0c;超轻量级、高度提炼&#xff0c;一套API优雅支持 UDP 、TCP 、WebSocket 三种协议&#xff0c;支持 iOS、Android、H5、标准Java、小程序、Uniapp&#xff0c;服务端基于Netty编写。 工程…

区分什么是Java内存模型(JMM)和 JVM运行时数据区

文章目录 一、概念区分1、什么是内存模型&#xff1f;什么是&#xff08;内存区域&#xff09;运行时数据区&#xff1f;2、为什么要有Java内存模型&#xff1f;2.1、硬件的效率与一致性2.2、 CPU和缓存的一致性2.2.1、为什么需要CPU cache&#xff1f;2.2.2、三级缓存&#xf…

Redis知识点总结

概述 Redis诞生于2009年&#xff0c;全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联&#xff1a;主要指的是表中没有主外键等概念 Redis是一款内存数据库&#xff0c;主要存储键值对类型的数据 基本用法 注意&#xff1a;该操作是在cli中进行的 首…

【MySQL系列】统计函数(count,sum,avg)详解

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【面向大一新生IT技术社群招新啦,不来瞅瞅?】

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生 &#x1f43b;‍❄️个人主页&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;落798. &#x1f54a;️系列专栏&#xff1a;【零基础学java】 ----- 【重识c语言】 ---- 【计算机网络】—【Spri…

接口测试时遇到接口加密了该如何处理?

对明文编码生成信息摘要&#xff0c;以防止被篡改。比如MD5使用的是Hash算法&#xff0c;无论多长的输入&#xff0c;MD5都会输出长度为128bits的一个串。摘要算法不要秘钥&#xff0c;客户端和服务端采用相同的摘要算法即可针对同一段明文获取一致的密文。 对称加密 对称加密…