UNIX网络编程读书笔记:辅助数据


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

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

cmsg_level; cmsg_type;

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

               control[CMSG_SPACE((

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

<sys/param.h> cmsghdr *CMSG_FIRSTHDR( msghdr * cmsghdr *CMSG_NXTHDR( msghdr *mhdrptr, cmsghdr * *CMSG_DATA( cmsghdr * CMSG_LEN(unsigned CMSG_SPACE(unsigned

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

 cmsghdr    *

(cmsgptr = CMSG_FIRSTHDR(&msg); cmsgptr != NULL; cmsgptr = CMSG_NXTHDR(&(cmsgptr->cmsg_level == ... && cmsgptr->cmsg_type ==*=

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

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

相关内容