- 浏览: 131366 次
文章分类
最新评论
辅助数据(ancillary data)也称控制信息(control information)。在recv/send 和 recvmsg/sendmsg 函数一节中介绍 sendmsg 和 recvmsg 函数时提到,可以使用 msghdr 结构中的 msg_control 和 msg_controllen 成员来发送和接收辅助数据。
下表总结了辅助数据的主要用途。
辅助数据是由一个或多个辅助数据对象(ancillary data object)构成,每个对象都以一个 cmsghdr 结构开头。
由 msg_control 指向的辅助数据必须为 cmsghdr 结构适当地对齐。下图展示了在一个控制缓冲区中出现 2 个辅助数据对象的例子(不是所有实现都支持在单个控制缓冲区中存放多个辅助数据对象)。
这里,msg_control 指向第一个辅助数据对象,msg_controllen 表示辅助数据的总长度。每个对象开头都是一个描述该对象的 cmsghdr 结构。在 cmsg_type 成员和实际数据之间可以有填充字节,从数据结尾处到下一个辅助数据对象之前也可以有填充字节。
为简化对辅助数据的处理,可以使用以下的 5 个宏来屏蔽对应用程序可能出现的填充字节。
这里需要注意的是,CMSG_FIRSTHDR 会在 msghdr 结构中没有辅助数据,或者 msg_control 为一个空指针,或者 cmsg_len 小于一个 cmsghdr 结构的大小时返回一个空指针。此外,CMSG_FIRSTHDR 宏的许多现有实现并不检查 msg_controllen 而直接返回 cmsg_control 的值,为保险起见,最好在调用该宏之前测试 msg_controllen 的值。
CMSG_LEN 和 CMSG_SPACE 的区别在于,前者不计算辅助数据对象中数据部分后可能的填充字节,因而返回的是用于存放在 cmsg_len 成员中的值,后者则会加上结尾处可能的填充字节,因此返回的是为辅助数据对象动态分配空间的大小值。
这几个宏可以如下形式的伪代码使用。
下表总结了辅助数据的主要用途。
辅助数据是由一个或多个辅助数据对象(ancillary data object)构成,每个对象都以一个 cmsghdr 结构开头。
#include <sys/socket.h> struct cmsghdr{ socklen_t cmsg_len; // length in bytes, includig this structure int cmsg_level; // originating protocol int cmsg_type; // protocol-specific type /* followed by unsigned char cmsg_data[] */ };
由 msg_control 指向的辅助数据必须为 cmsghdr 结构适当地对齐。下图展示了在一个控制缓冲区中出现 2 个辅助数据对象的例子(不是所有实现都支持在单个控制缓冲区中存放多个辅助数据对象)。
这里,msg_control 指向第一个辅助数据对象,msg_controllen 表示辅助数据的总长度。每个对象开头都是一个描述该对象的 cmsghdr 结构。在 cmsg_type 成员和实际数据之间可以有填充字节,从数据结尾处到下一个辅助数据对象之前也可以有填充字节。
为简化对辅助数据的处理,可以使用以下的 5 个宏来屏蔽对应用程序可能出现的填充字节。
#include <sys/socket.h> #include <sys/param.h> /* for ALIGN macro on many implementations */ struct cmsghdr* CMSG_FIRSTHDR(struct msghdr *mhdrptr); /* 返回值:指向第一个 cmsghdr 结构的指针,若无辅助数据则为 NULL */ struct cmsghdr* CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr); /* 返回值:指向下一个 cmsghdr 结构的指针,若不再有辅助数据对象则为 NULL */ unsigned char* CMSG_DATA(struct cmsghdr *cmsgptr); /* 返回值:指向与 cmsghdr 结构相关联的数据的第一个字节的指针 */ unsigned int CMSG_LEN(unsigned int length); /* 返回值:给定数据量下存放到 cmsg_len 中的值 */ unsigned int CMSG_SPACE(unsigned int length); /* 返回值:给定数据量下一个辅助数据对象总的大小 */
这里需要注意的是,CMSG_FIRSTHDR 会在 msghdr 结构中没有辅助数据,或者 msg_control 为一个空指针,或者 cmsg_len 小于一个 cmsghdr 结构的大小时返回一个空指针。此外,CMSG_FIRSTHDR 宏的许多现有实现并不检查 msg_controllen 而直接返回 cmsg_control 的值,为保险起见,最好在调用该宏之前测试 msg_controllen 的值。
CMSG_LEN 和 CMSG_SPACE 的区别在于,前者不计算辅助数据对象中数据部分后可能的填充字节,因而返回的是用于存放在 cmsg_len 成员中的值,后者则会加上结尾处可能的填充字节,因此返回的是为辅助数据对象动态分配空间的大小值。
这几个宏可以如下形式的伪代码使用。
struct msghdr msg; struct cmsghdr *cmsgptr; /* fill in msg structure */ /* call recvmsg() */ for(cmsgptr=CMSG_FIRSTHDR(&msg); cmsgptr!=NULL; cmsgptr=CMSG_NXTHDR(&msg, cmsgptr)){ if(cmsgptr->cmsg_level == ... && cmsgptr->cmsg_type == ...){ u_char *ptr = CMSG_DATA(cmsgptr); /* process data pointed to by ptr */ } }
发表评论
-
Unix 域套接字与描述符的传递
2019-03-27 23:59 672在Unix 域套接字概述一节中介绍了什么是 U ... -
Unix 域套接字概述
2019-03-12 22:48 920Unix 域协议并不是一个实际的协议族,而是在 ... -
kqueue 接口
2019-03-06 00:47 632kqueue 接口是 ... -
recv/send 和 recvmsg/sendmsg 函数
2019-01-22 00:40 1399recv 和 send ... -
inetd 守护进程介绍
2019-01-09 21:51 996在 4.3 BSD 系统之前,很多网络服务都是 ... -
主机名与 IP 地址的转换(续)
2018-12-25 00:37 908在主机名与 IP 地址的转换一节中提到的 ge ... -
主机名与 IP 地址的转换
2018-11-14 00:20 2193在网络编程中,尽管大部分情况下操作的都是 IP ... -
SCTP 事件通知
2018-02-08 03:49 865SCTP 提供了多种可用的通知,用户可经由这些通知追踪 ... -
SCTP 套接字选项
2018-02-04 09:35 1583在获取和设置套接 ... -
SCTP 套接字编程基础函数
2018-02-04 10:08 995SCTP 服务器可以使 ... -
SCTP 套接字编程基础概念
2018-01-18 00:10 498SCTP 套接字分为一到一套接字和一到多套接字。提供一 ... -
UDP套接字编程基础
2018-01-14 10:37 519下图显示了使用 UDP 套接字编写客户/服务器程序时的 ... -
通用套接字选项
2018-01-02 00:46 503在获取和设置套接 ... -
获取和设置套接字选项
2017-12-29 08:21 406下面几种方法可用 ... -
I/O 复用之 poll 函数
2017-12-27 00:20 375poll 函数提供的功能与 select 类似,不过在 ... -
I/O 复用之select 函数
2017-12-12 00:32 476select 函数允许进 ... -
Unix 5 种 IO 模型概述
2017-11-19 01:44 271Unix 下有 5 种可用 ... -
套接字创建、连接和关闭函数
2017-08-13 17:16 602下图是一对 TCP 客户与服务器进程之间发生的一些典型 ... -
字节转换和填充函数
2017-08-06 01:09 393网络编程中,为保证发送协议栈和接收协议栈就如 32 位 ... -
IPv4 和 IPv6 的套接字地址结构
2017-08-01 21:03 696大多数套接字函数 ...
相关推荐
分享新版本intouch辅助数据源实现;SERVER2作为SERVER1的辅助数据源,当SERVER1通讯故障或DAServer停止工作时,客户端会自动切换为访问SERVER2的DAServer。当SERVER1恢复正常时,客户端返回到访问SERVER1。
在高版本(10.0以上)的INTOUCH中添加了访问名的辅助数据源功能,本文档详细的介绍了该功能具体的实现过程。
U8.90先进先出计价方式下,计价辅助数据表重算工具,重算前做好软件备份。
GY T 161-2000 数字电视附属数据空间内数字音频和辅助数据的传输规范 相当于SMPTE-125M的国标。
[工具名称]: U8计价辅助数据表重算工具 [详细说明]: 计价辅助数据表中数据如果错乱,可能导致以下问题: 1、出库成本不能按正常的先进先出计价方式计算出正确的成本; 2、年结的时候导致存货模块上年结余金额和...
[工具名称]: U8 7.0计价辅助数据表重算工具 [详细说明]: 计价辅助数据表中数据如果错乱,可能导致以下问题: 1、出库成本不能按正常的先进先出计价方式计算出正确的成本; 2、年结的时候导致存货模块上年结余金额...
卫星定位辅助数据下载,即不需要3G网点,可以通过WIFI来下载卫星定位数据,实现AGPS的功能。方便PAD用户使用。
AGPS 辅助定位 文档 代码 AGPS辅助数据文档 参考代码
固定资产总账重算工具,解决固定资产卡片明细与总账不一致问题。
SPS辅助数据为地震勘探中使用的国际标准的数据格式,它最早是由壳牌公司制定的,后来为同行业认可的国际标准
土地利用变化检测是国内外全球化进程研究的...提出了一种以GIS辅助数据获取像斑建立样本特征数据库的方法进行遥感影像变化检测。该方法可充分利用多源数据,并提高变化检测方法的自动化程度。实验证明了方法的有效性。
在高版本(10.0以上)的INTOUCH中添加了访问名的辅助数据源功能,本文档详细的介绍了该功能具体的实现过程。
Oracle数据库辅助数据字典的实现.pdf
液体火简发动机计算机辅助数据分析系统rar,液体火简发动机计算机辅助数据分析系统
网络游戏-网络侧经由有选择延迟辅助数据传输去除定位辅助的模糊性.zip
一种机器学习辅助数据中心传输资源分配优化策略.pdf
matlab开发-建立计算机网络辅助数据恢复地图。来自在线研讨会的幻灯片和演示文件。
借助YOLO、Segment Anything、MobileSAM的人工智能支持,轻松实现人工智能辅助数据标注!!
电信设备-Alpha稳定分布噪声下衰落信道非辅助数据均衡方法.zip