- 浏览: 140258 次
文章分类
最新评论
辅助数据(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 709在Unix 域套接字概述一节中介绍了什么是 U ... -
Unix 域套接字概述
2019-03-12 22:48 975Unix 域协议并不是一个实际的协议族,而是在 ... -
kqueue 接口
2019-03-06 00:47 683kqueue 接口是 ... -
recv/send 和 recvmsg/sendmsg 函数
2019-01-22 00:40 1535recv 和 send ... -
inetd 守护进程介绍
2019-01-09 21:51 1044在 4.3 BSD 系统之前,很多网络服务都是 ... -
主机名与 IP 地址的转换(续)
2018-12-25 00:37 953在主机名与 IP 地址的转换一节中提到的 ge ... -
主机名与 IP 地址的转换
2018-11-14 00:20 2297在网络编程中,尽管大部分情况下操作的都是 IP ... -
SCTP 事件通知
2018-02-08 03:49 973SCTP 提供了多种可用的通知,用户可经由这些通知追踪 ... -
SCTP 套接字选项
2018-02-04 09:35 1682在获取和设置套接 ... -
SCTP 套接字编程基础函数
2018-02-04 10:08 1048SCTP 服务器可以使 ... -
SCTP 套接字编程基础概念
2018-01-18 00:10 558SCTP 套接字分为一到一套接字和一到多套接字。提供一 ... -
UDP套接字编程基础
2018-01-14 10:37 570下图显示了使用 UDP 套接字编写客户/服务器程序时的 ... -
通用套接字选项
2018-01-02 00:46 544在获取和设置套接 ... -
获取和设置套接字选项
2017-12-29 08:21 434下面几种方法可用 ... -
I/O 复用之 poll 函数
2017-12-27 00:20 421poll 函数提供的功能与 select 类似,不过在 ... -
I/O 复用之select 函数
2017-12-12 00:32 514select 函数允许进 ... -
Unix 5 种 IO 模型概述
2017-11-19 01:44 304Unix 下有 5 种可用 ... -
套接字创建、连接和关闭函数
2017-08-13 17:16 661下图是一对 TCP 客户与服务器进程之间发生的一些典型 ... -
字节转换和填充函数
2017-08-06 01:09 426网络编程中,为保证发送协议栈和接收协议栈就如 32 位 ... -
IPv4 和 IPv6 的套接字地址结构
2017-08-01 21:03 735大多数套接字函数 ...
相关推荐
AGPS通过从网络服务器获取辅助数据来帮助用户设备,这些数据包括卫星的精确时钟信息、伪距校正和星座状态等。 文档"AssistNowOnlineImplementation_AppNote_(GPS-SW-09008-C).pdf"很可能包含了关于如何实现AGPS在线...
《U8.90计价辅助数据表重算工具详解》 在企业信息化管理中,用友U8.90是一款广泛使用的财务及企业管理软件,它涵盖了企业的财务、供应链、生产等多个业务领域。其中,计价辅助数据表是财务管理中的一个重要组成部分...
随着技术的发展,INTOUCH在高版本(10.0及以上)中引入了辅助数据源功能,这一特性极大地扩展了其数据集成和处理的能力,使得用户能够更加灵活地接入和管理各种类型的数据源。本文将详细介绍如何利用INTOUCH的辅助...
分享新版本intouch辅助数据源实现;SERVER2作为SERVER1的辅助数据源,当SERVER1通讯故障或DAServer停止工作时,客户端会自动切换为访问SERVER2的DAServer。当SERVER1恢复正常时,客户端返回到访问SERVER1。
[工具名称]: U8计价辅助数据表重算工具 [详细说明]: 计价辅助数据表中数据如果错乱,可能导致以下问题: 1、出库成本不能按正常的先进先出计价方式计算出正确的成本; 2、年结的时候导致存货模块上年结余金额和...
### SPS辅助数据处理使用手册知识点详述 #### 一、SPS格式标准简介 **1.1 SPS标准格式数据文件说明** - **SPS格式定义**: SPS(Shell Processing Support Format for Land 3D Surveys)是英国SHELL公司制定的一种...
在介绍地震电磁卫星辅助数据处理及原型系统设计时,该文件中包含了丰富的专业知识和关键技术点,详细说明了辅助数据的定义、分类、处理流程及其在原型系统中的应用。下面是基于所给文件内容的详细知识点梳理: 1. ...
【Oracle数据库辅助数据字典的实现】 Oracle数据库是关系型数据库管理系统的一种,它包含一个称为数据字典的组件,用于存储关于用户定义的对象、数据库结构和内部表的相关信息。数据字典由系统用户SY拥有,并始终...
[工具名称]: U8 7.0计价辅助数据表重算工具 [详细说明]: 计价辅助数据表中数据如果错乱,可能导致以下问题: 1、出库成本不能按正常的先进先出计价方式计算出正确的成本; 2、年结的时候导致存货模块上年结余金额...
INTOUCH 辅助数据源功能实现 INTOUCH 辅助数据源功能是高版本(10.0以上)的 INTouch 中的一项重要功能,该功能允许在 SERVER1 通讯故障或 DAServer 停止工作时,客户端自动切换到访问 SERVER2 的 DAServer,从而...
【地震辅助数据处理技术在准噶尔盆地的应用】 在当今的地震勘探领域,随着"两宽一高"(宽道、宽频带、高分辨率)采集技术的普及,原始地震数据呈现爆炸式增长,步入了大数据时代。面对海量的数据,传统的人工处理...
随着计算机技术的飞速发展,计算机辅助数据处理已经成为改进传统物理实验教学、提高数据处理效率和准确性的关键手段。本文就将详细探讨计算机辅助数据处理在大学物理实验中的应用,特别是Origin软件在这一过程中的...
随着计算机技术的发展,计算机辅助数据处理技术被应用到齿距测量中,显著提高了数据处理的效率和准确性。 在本篇论文《齿轮齿距测量的计算机辅助数据处理》中,作者刘彦伟从河北省广播电视局出发,研究了在微机上...
本文主要探讨了机床夹具定位误差的计算机辅助数据处理方法,以及相关的研究进展。 首先,定位误差的研究现状表明,国内外学者已经进行了大量工作,包括利用旋量理论、变分法、前向和逆向运动学等方法来分析和预测...
卫星定位辅助数据下载,即不需要3G网点,可以通过WIFI来下载卫星定位数据,实现AGPS的功能。方便PAD用户使用。
在网络游戏领域,网络侧通过有选择的延迟辅助数据传输来去除定位辅助的模糊性是一个重要的技术议题。这一方法旨在优化玩家的游戏体验,特别是在多人在线竞技游戏中,精确的定位信息对于游戏公平性和玩家策略至关重要...
齿轮齿距测量的计算机辅助数据处理与分析是齿轮制造与检测领域的重要技术手段,主要涉及数据处理、大数据分析以及专业指导。齿轮的齿距误差是评价齿轮质量的关键指标,它反映了齿轮相对于齿轮旋转轴线分布的不均匀性...
标题中的“液体火箭简发动机计算机辅助数据分析系统”指的是利用计算机技术对液体火箭发动机进行数据收集、分析和模拟的工具或平台。这样的系统通常用于优化发动机的设计、测试性能、预测运行状态以及解决工程问题。...