辅助数据(ancillary data)可通过调用sendmsg和recvmsg这两个函数,使用msghdr结构中的msg_control和msg_controllen这两个成员发送和接收。

辅助数据的另一个称谓是控制信息(control information)。

辅助数据由一个或多个辅助数据对象(ancillary data object)构成,每个对象以一个定义在头文件<sys/socket.h>中的cmsghdr结构开头。

struct cmsghdr {socketlen_t    cmsg_len;      /* length in bytes, including this structure */int            cmsg_level;    /* originating protocol */int            cmsg_type;     /* protocol-specific type *//* followed by unsigned char msg_data[] */
};

由msg_control指向的辅助数据必须为各个cmsghdr结构适当地对齐,如下所示为一种对齐方法:

union {struct cmsghdr     cm;char               control[CMSG_SPACE(sizeof(int))];
}control_un;

如下图所示,展示了在一个控制缓冲区中出现2个辅助数据对象的一个例子:

msg_control指向第一个辅助数据对象,辅助数据的总长度则由msg_controllen指定。每个对象开头都是一个描述该对象的cmsghdr结构。在cmsg_type成员和实际数据之间可以有填充字节,从数据结尾处到下一个辅助数据对象之前也可以有填充字节。

注意,不是所有实现都支持在单个控制缓冲区中存放多个辅助数据对象。

如下图所示,展示了通过一个UNIX域套接口传递描述字或传递凭证时所用的cmsghdr结构的格式。

既然由recvmsg返回的辅助数据可含有任意数目的辅助数据对象,为了对应用程序屏蔽可能出现的填充字节,头文件<sys/socket.h>中定义了以下5个宏,以简化对辅助数据的处理。

#include <sys/socket.h>
#include <sys/param.h>    /* for ALIGN macro on many implementations */struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mhdrptr);
返回:指向第一个cmsghdr结构的指针,无辅助数据时为NULLstruct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr);
返回:指向下一个cmsghdr结构的指针,不再有辅助数据对象时为NULLunsigned char *CMSG_DATA(struct cmsghdr *cmsgptr);
返回:指向与cmsghdr结构关联的数据的第一个字节的指针unsigned int CMSG_LEN(unsigned int length);
返回:给定数据量下存放到cmsg_len中的值unsigned int CMSG_SPACE(unsigned int length);
返回:给定数据量下一个辅助数据对象总的大小

这些宏可以按照如下伪代码形式使用:

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;ptr = CMSG_DATA(cmsgptr);/* process data pointed to by ptr */}
}

CMSG_FIRSTHDR返回指向第一个辅助数据对象的指针,然而如果在msghdr结构中没有辅助数据(或者msg_control为一个空指针,或者cmsg_len小于一个cmsghdr结构的大小),那就返回一个空指针。当控制缓冲区中不再有下一个辅助数据对象时,CMSG_NXTHDR也返回一个空指针。

CMSG_LEN和CMSG_SPACE的区别在于,前者不计辅助数据对象中数据部分之后可能的填充字节,因而返回的是用于存放在cmsg_len成员中的值,后者计上结尾处可能的填充字节,因而返回的是用于为辅助对象动态分配空间的大小值。

转载于:https://www.cnblogs.com/nufangrensheng/p/3607487.html

UNIX网络编程读书笔记:辅助数据相关推荐

  1. UNIX网络编程--读书笔记

    会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...

  2. Unix 网络编程 读书笔记1

    第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64. ► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32 位的地 ...

  3. UNIX网络编程读书笔记:套接口选项

    概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...

  4. UNIX网络编程读书笔记:套接口地址结构

    前言 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以"sockaddr_"开头,并以对应每个协议族的唯一后缀 ...

  5. UNIX网络编程学习笔记(代码超详细解析)(持续更新)

    1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...

  6. 2021版!万字UNIX网络编程学习笔记(套接字篇)

    目录 1.一个简单的时间获取服务器的程序 2.套接字篇 2.1 套接字简介 2.2 套接字中常用的函数 2.3 基本TCP套接字编程 2.3.1.socket函数 2.3.2 connect函数 2. ...

  7. 网络编程学习笔记(辅助数据)

    在sendmsg和recvmsg时使用msghdr结构中的msg_control和msg_controllen成员发送的接收辅助数据.辅助数据的另一种叫法是控制信息. 协议 cmsg_level cm ...

  8. Unix网络编程学习笔记之第11章 名字与地址转换

    一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 D ...

  9. java网络编程读书笔记-Ch03

    ch03 Threads Running Threads Subclassing Thread Implementing the Runnable Interface Returning Inform ...

最新文章

  1. pytorch 笔记:tensorboardX
  2. win7任务栏计算机图标,Win7系统任务栏怎么添加显示桌面图标 显示桌面图标如何放到win7任务栏...
  3. python面向对象实现简易银行管理员页面系统【导入自定义模块】
  4. php怎么上传函数,php上传函数怎么封装
  5. MySQL 正则表达式
  6. 第一门语言学python好_零基础学编程,哪一门语言比较适合入门?
  7. [Ajax] Ajax的基本用法
  8. linux无法将文件移入回收站,linux中使用rm命令将文件移到回收站的方法
  9. 2018年4月10日--python解决乱码和作业
  10. SSD6中Exercise4 (substitute.cpp) 答案解析
  11. strcore.cpp(156) 内存泄漏
  12. 俄罗斯 90 后天才写 5 年代码创收 1000 亿美金
  13. 加密解密:使用对称密码加密文件
  14. 管家婆财贸双全TOP系列服务器,管家婆财贸双全II
  15. python打印数组
  16. python另存为excel_python 将数据保存为excel的xls格式(实例讲解)
  17. 【四足机器人那些事】足端轨迹规划(一)
  18. elementUI使用卡槽二次封装table(亲测可用)
  19. Java 面向对象学习一周小结
  20. PyQt5:布局,pushbutton按钮,radiobutton按钮,lableImage设置图片的基本使用方法

热门文章

  1. android 对象数据库中,解析嵌套的JSON对象,并存储在数据库中的Android
  2. 云梦天气预报软件测试,云梦天气预报15天
  3. emmap erlang_erlang的map基本使用
  4. 【GDKOI2004】使命的召唤
  5. 魔法照片pascal程序
  6. 工作分配问题pascal程序
  7. 2020-10-13 多智能体基本图论
  8. POJ 1741 Tree(点分治)
  9. SQL语句统计每天、每月、每年的数据
  10. Dijkstra 最短路