【计算机网络】网络编程接口 Socket API 解读(9)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。
本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。
socket(7)
send() 遵循 POSIX.1 - 2008
MSG_CONFIRM 是 Linux 扩展
1.库
标准 c 库,libc, -lc
2.头文件
<sys/socket.h>
3.接口定义
sockfd = socket(int socket_family, int socket_type, int protocol);
4.接口描述
续 【计算机网络】网络编程接口 Socket API 解读(8)
SO_PEEK_OFF(Linux 3.4 后)
这个选项目前只有 unix(7) 套接字支持,在 recv(2) 系统调用使用了 MSG_PEEK 标记时,可以用它来设置 “peek offset”,即窥探偏移。
当这个选项值设置为负值时(对于所有新套接字,这个值都被设置为了 -1),窥探行为会采用传统行为,即携带 MSG_PEEK 标记的 recv(2) 会从队列头窥探数据。
当这个选项值大于等于 0 时,那么下一次窥探位置就是这个选项指定的偏移地址。同时,窥探偏移会加上之前已经偏移过的值,这样下一次窥探才会返回队列中下一个数据。
如果 recv(2) 或者其他接口没有使用 MSG_PEEK 标记导致数据从队列头移出,那么窥探偏移就会减去这个移出值。 换句话说,不使用 MSG_PEEK 标记会导致窥探偏移调整以保持正确的相对位置,保证后面窥探到的数据和没有移除数据时窥探到的数据相同。
对于数据报套接字,如果窥探偏移指向了一个数据包的中间,那么返回的数据会被标记为 MSG_TRUNC。
下面的例子解释 SO_PEEK_OFF 如何使用,假如流套接字里排队的输入数据如下:
aabbccddeeff
下面的 recv() 调用效果如注释所述:
int ov = 4; // Set peek offset to 4setsockopt(fd, SOL_SOCKET, SO_PEEK_OFF, &ov, sizeof(ov));recv(fd, buf, 2, MSG_PEEK); // Peeks "cc"; offset set to 6recv(fd, buf, 2, MSG_PEEK); // Peeks "dd"; offset set to 8recv(fd, buf, 2, 0); // Reads "aa"; offset set to 6recv(fd, buf, 2, MSG_PEEK); // Peeks "ee"; offset set to 8
SO_PEERCRED
返回连接到套接字的对端进程的凭证。更多详细信息,参考 unix(7)。
SO_PEERSEC(Linux 2.6.2 后)
返回连接到套接字的对端进程的安全上下文。更多信息,参考 unix(7)。
SO_PRIORITY
设置套接字上所有要发送数据包协议定义的优先级。Linux 使用这个值来给网络队列排序:具有高优先级的数据包可以被优先处理,依赖于选定设备的排队规则。设置超出 0~6 的优先级需要 CAP_NET_ADMIN 能力。
SO_PROTOCOL(Linux 2.6.32 后)
获得套接字协议值,返回值类似 IPPROTO_SCTP 这样的整型值。参考 socket(2) 获取更多信息。这个套接字选项是只读的。
SO_RCVBUF
设置/获取最大套接字接收缓冲区大小(字节数)。当使用 setsockopt(2) 设置这个值时,内核会使用这个值的两倍(考虑到其他记录结构开销),使用 getsockopt(2) 返回两倍的值。默认值在 /proc/sys/net/core/rmem_default 文件设置,最大值由 /proc/sys/net/core/rmem_max 文件设置。最小值(双倍的)是 256。
SO_RCVBUFFORCE(Linux 2.6.14 后)
具备 CAP_NET_ADMIN 能力的特权进程可以通过这个选项进行和 SO_RCVBUF 类似的设置,但是这个可以设置 rmem_max 最大限制值。
SO_RCVLOWAT 和 SO_SNDLOWAT
设置套接字层将数据交由底层协议的最小缓冲量(SO_SNDLOWAT)以及用户接收到数据的最小值(SO_RCVLOWAT)。这两个值初始化为 1,SO_SNDLOWAT 在 Linux 上不可改(setsockopt(2) 会返回 ENOPROTOOPT 错误),SO_RCVLOWAT 在 Linux 2.4 后可以修改。
Linux 2.6.28 之前,Linux 上 select(2)/poll(2)/epoll(7) 不看 SO_RCVLOWAT 设置,即使有一个字节也认为套接字是读就绪的,接下来从套接字读取会阻塞直到 SO_RCVLOWAT 字节可用。Linux 2.6.28 后,这几个接口只有在字节达到 SO_RCVLOWAT 值时才会套接字标记为读就绪。
SO_RCVTIMEO 和 SO_SNDTIMEO
指定接收和发送超时值,参数是 struct timeval 类型。如果一个输入/输出函数阻塞这么长时间,并且发送或者接收了一部分数据,那么会返回已传输数据量,如果没有传输任何数据,那么会返回 -1 并设置 errno 为 EAGAIN 或者 EWOULDBLOCK,或者套接字设置为非阻塞时返回 EINPROGRESS(只对 connect(2) 有效)。如果超时值设置为 0(默认值),那么对应操作永不超时。超时只对进行 I/O 操作的系统调用生效(比如 accept(2)、connect(2)、read(2)、recvmsg(2)、send(2)、sendmsg(2)),对于 select(2)、poll(2)、epoll_wait(2) 等无效。
SO_REUSEADDR
表示 bind(2) 中用于验证地址有效性的规则允许本地地址重用。对于 AF_INET 套接字,套接字可以绑定到正在被监听的本地地址外的任何地址。当监听套接字绑定了到 INADDR_ANY 并指定了端口,那么任何地址上都不能再绑定该端口。参数是一个整型布尔标记。
SO_REUSEPORT(Linux 3.9 后)
允许多个 AF_INET 或者 AF_INET6 套接字绑定到相同的套接字地址上。这个选项必须在 bind(2) 前设置到每个套接字上(包括第一个套接字)。为了防止端口劫持,绑定到相同地址的所有进程必须具有相同的有效 UID。这个选项可以用于 TCP 和 UDP 套接字上。
对于 TCP 套接字,这个选项允许 accept(2) 在多线程服务器上进行负载分配,每个线程使用一个不同的监听套接字。这种方式比传统方式高效很多,比如使用一个单线程进行 accept(2) 分配连接,或者有多个线程在同一个套接字上进行 accept(2) 竞争。
对于 UDP 套接字,比起传统的多个进程在同一个套接字上竞争接收数据报,这种方式能够允许多进程(线程)对过来的数据报进行更好的负载分配。
SO_RXQ_OVFL(Linux 2.6.33 后)
表示需要携带一个 32 位的辅助消息来接收 skbs,skbs 是自从套接字创建以来丢包总数。
SO_SELECT_ERR_QUEQUE(Linux 3.10 后)
设置这个选项的套接字,套接字上的错误不仅仅会通过 select(2) 的 exceptfds 通知,同样 poll(2) 也会在返回 POLLERR 事件时,返回一个 POLLPRI 错误。
5.示例代码
下面是一个 getsockopt 函数的使用代码:
int rc;
int s;
int option_value;
int option_len;
struct linger l;
int getsockopt(int s, int level, int option_name,
char *option_value,int *option_len);⋮
/* Is out-of-band data in the normal input queue? */
option_len = sizeof(int);
rc = getsockopt(s, SOL_SOCKET, SO_OOBINLINE, (
char *) &option_value, &option_len);
if (rc == 0)
{if (option_len == sizeof(int)){if (option_value)/* yes it is in the normal queue */else/* no it is not*/}
}⋮
/* Do I linger on close? */
option_len = sizeof(l);
rc = getsockopt(s, SOL_SOCKET, SO_LINGER, (char *) &l, &option_len);
if (rc == 0)
{if (option_len == sizeof(l)){if (l.l_onoff)/* yes I linger */else/* no I do not */}
}
相关文章:
【计算机网络】网络编程接口 Socket API 解读(9)
Socket 是网络协议栈暴露给编程人员的 API,相比复杂的计算机网络协议,API 对关键操作和配置数据进行了抽象,简化了程序编程。 本文讲述的 socket 内容源自 Linux man。本文主要对各 API 进行详细介绍,从而更好的理解 socket 编程。…...

用户端App自动化测试
一、capability 进阶用法 1、 deviceName 只是设备的名字,别名随便起不能锁定唯一一个设备 2、 uid 多设备选择的时候,要指定 uid默认读取设备列表的第一个设备设备列表获取 adb devices 3、 newCommandTimeout appium 程序应等待来自客户端的新命…...
[洛谷]P2697 宝石串(经典好题!)
思路: 对于一个类似的东西进行前缀和: G R G G R G G:1 1 2 3 3 4 R:0 1 1 1 2 2 差:1 0 1 2 1 2 所得关于差的数列,同样的数最左最右的位置差为一个答案,选取最大的答案即为解࿰…...

毫米波汽车雷达测试应用指南
汽车毫米波雷达测试背景 车载毫米波雷达通过天线向外发射毫米波,接收目标反射信号,经后方处理后快速准确地获取汽车车身周围的物理环境信息(如汽车与其他物体之间的相对距离、相对速度、角度、运动方向等),然后根据所…...

抖音账号矩阵系统开发源码----技术研发
一、技术自研框架开发背景: 抖音账号矩阵系统是一种基于数据分析和管理的全新平台,能够帮助用户更好地管理、扩展和营销抖音账号。 抖音账号矩阵系统开发源码 部分源码分享: ic function indexAction() { //面包屑 $breadc…...

C++ 33.学习C++的意义-狄泰软件学院
一些历史 UNIX操作系统诞生之初是直接用汇编语言编写的随着UNIX系统的发展,汇编语言的开发效率成为瓶颈,所以需要一个新的语言替代汇编语言1971年通过对B语言改良,使其能直接产生机器代码,C语言诞生UNIX使用C语言重写,…...

[C++基础]-多态
前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正。 本期学习目标&am…...

【Kubernetes】当K8s出现问题时,我们可以从哪些方面排查出
前言 kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kub…...

SentenceTransformer 之论文解读
摘要 原文标题:Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks 链接:https://arxiv.org/pdf/1908.10084.pdf 尽管Bert和RoBERTa在句子对回归任务上,例如语义文本相似度(Semantic Text Similarity)…...

AI发展历史
一、AI的发展历史 二、AI发展的第五阶段 (一)、第一阶段 1.艾伦图灵与模仿游戏 艾伦•图灵(Alan Turing,1912~1954)是英国数学家、逻辑学家,被称为计算机科学之父,人工智能之父。二战中协助军…...

想要精通算法和SQL的成长之路 - 简化路径
想要精通算法和SQL的成长之路 - 简化路径 前言一. 简化路径 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 简化路径 原题连接 思路如下: 我们根据 "/" 去拆分字符串,得到每个子目录。这里拿到的子目录可能是空字符串,需要…...

【哈士奇赠书活动 - 41期】- 〖产品设计软技能:创业公司篇〗
文章目录 ⭐️ 赠书 - 《产品设计软技能:创业公司篇》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《产品设计软技能:创业公司篇》 ⭐️ 内容简介 在创业公司设计产品与在成熟公司设计产品存在明显差异。《产品设计软…...

MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving
MARS: An Instance-aware, Modular and Realistic Simulator for Autonomous Driving(基于神经辐射场的自动驾驶仿真器)https://github.com/OPEN-AIR-SUN/marshttps://arxiv.org/pdf/2307.15058.pdfhttps://mp.weixin.qq.com/s/6Ion_DZGJwzs8JOoWMMbPw …...
关联规则挖掘(上):数据分析 | 数据挖掘 | 十大算法之一
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据开发、数据分析等。 🐴欢迎小伙伴们点赞👍🏻、收藏⭐️、…...
centos7 + citus12 + postgresql 14 安装
1 安装及编译 yum install -y centos-release-scl-rh epel-release yum update -y yum groupinstall -y Development Tools yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm yum install -y postg…...
MySQL、Oracle、SQL Server / MS Access 中的 NULL函数用法
一、MySQL: isnull(exper) 判断exper是否为空,是则返回1,否则返回0 ifnull(exper1,exper2)判断exper1是否为空,是则用exper2代替 nullif(exper1,exper2)如果expr1 expr2 成立,那么返回值为NULL,否则返回值…...
App Store审核被拒原因与解决方案
为了避免不必要的上线延迟及成本增加,了解App Store审核被拒的常见原因以及对应的解决方案是开发人员以及营销人员的必修课。 CSDN相关的解决方案 App Store审核被拒的12个常见原因与快速过审解决方法...
LeetCode解法汇总121. 买卖股票的最佳时机
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给定一个数…...

【Go】go-es统计接口被刷数和ip访问来源
go-es模块统计日志中接口被刷数和ip访问来源 以下是使用go的web框架gin作为后端,展示的统计页面 背景 上面的数据来自elk日志统计。因为elk通过kibana进行展示,但是kibana有一定学习成本且不太能满足定制化的需求,所以考虑用编程的方式…...
debian 安装 pg --chatGpt
pgt: 要在Debian上安装PostgreSQL (通常缩写为PG) 数据库,您可以使用apt包管理器来执行安装操作。以下是安装PostgreSQL的步骤: 1. 打开终端。 2. 使用sudo权限以管理员身份运行以下命令,以更新包信息并安装PostgreSQL: bash …...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...