UNIX网络编程读书笔记:辅助数据
辅助数据(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网络编程读书笔记:辅助数据相关推荐
- UNIX网络编程--读书笔记
会集中这段时间写UNIX网络编程这本书的读书笔记,准备读三本,这一系类的文章会不断更新,一直会持续一个月多,每篇的前半部分是书中讲述的内容,每篇文章的后半部分是自己的心得体会,文章中的红色内容是很重要 ...
- Unix 网络编程 读书笔记1
第一章: C/C++语言提供两种不同的编程模式:IPL32和PL64. ► IPL32 ● 表示integer/pointer/long三种数据类型是32位(4个字节),在这种模式下,提供32 位的地 ...
- UNIX网络编程读书笔记:套接口选项
概述 有很多方法来获取和设置影响套接口的选项: getsockopt和setsockopt函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数 这两个函数仅用于套接口. ...
- UNIX网络编程读书笔记:套接口地址结构
前言 大多数套接口函数都需要一个指向套接口地址结构的指针作为参数.每个协议族都定义它自己的套接口地址结构.这些结构的名字均以"sockaddr_"开头,并以对应每个协议族的唯一后缀 ...
- UNIX网络编程学习笔记(代码超详细解析)(持续更新)
1. 其他函数准备 1. TCP 回射服务器程序: str_echo 函数 #include "unp.h"void str_echo(int sockfd) {ssize_t n ...
- 2021版!万字UNIX网络编程学习笔记(套接字篇)
目录 1.一个简单的时间获取服务器的程序 2.套接字篇 2.1 套接字简介 2.2 套接字中常用的函数 2.3 基本TCP套接字编程 2.3.1.socket函数 2.3.2 connect函数 2. ...
- 网络编程学习笔记(辅助数据)
在sendmsg和recvmsg时使用msghdr结构中的msg_control和msg_controllen成员发送的接收辅助数据.辅助数据的另一种叫法是控制信息. 协议 cmsg_level cm ...
- Unix网络编程学习笔记之第11章 名字与地址转换
一. 域名系统(DNS) 1. 简介 DNS主要用于主机名和IP地址之间的映射. 主机名可以是简单的名字ljm,也可以是全限定域名ljm.localdomainbaidu.com等. 2.资源记录 D ...
- java网络编程读书笔记-Ch03
ch03 Threads Running Threads Subclassing Thread Implementing the Runnable Interface Returning Inform ...
最新文章
- pytorch 笔记:tensorboardX
- win7任务栏计算机图标,Win7系统任务栏怎么添加显示桌面图标 显示桌面图标如何放到win7任务栏...
- python面向对象实现简易银行管理员页面系统【导入自定义模块】
- php怎么上传函数,php上传函数怎么封装
- MySQL 正则表达式
- 第一门语言学python好_零基础学编程,哪一门语言比较适合入门?
- [Ajax] Ajax的基本用法
- linux无法将文件移入回收站,linux中使用rm命令将文件移到回收站的方法
- 2018年4月10日--python解决乱码和作业
- SSD6中Exercise4 (substitute.cpp) 答案解析
- strcore.cpp(156) 内存泄漏
- 俄罗斯 90 后天才写 5 年代码创收 1000 亿美金
- 加密解密:使用对称密码加密文件
- 管家婆财贸双全TOP系列服务器,管家婆财贸双全II
- python打印数组
- python另存为excel_python 将数据保存为excel的xls格式(实例讲解)
- 【四足机器人那些事】足端轨迹规划(一)
- elementUI使用卡槽二次封装table(亲测可用)
- Java 面向对象学习一周小结
- PyQt5:布局,pushbutton按钮,radiobutton按钮,lableImage设置图片的基本使用方法