【计算机网络】网络编程接口 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 …...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
