本文是在其他博文基础上,进行总结汇总,以便能够通过该文章,就能够直接理解其原理和使用方法。
介绍使用方法之前,我们需要先了解几个知识点!
一、 联合的概念union
1、union中可以定义多个成员, union的大小由最大的成员的大小决定。
2、union成员共享同一块大小的内存, 一次只能使用其中的一个成员。
3、对某一个成员赋值,会覆盖其他成员的值(因为他们共享一块内存。
但前提是成员所占字节数相同,当成员所占字节数不同时只会覆盖相应字节上的值,
比如对char成员赋值就不会把整个int成员覆盖掉,
因为char只占一个字节,而int占四个字节
4、联合体union的存放顺序是所有成员都从低地址开始存放的。
二、 msghdr和cmsghdr结构体的关系
列出结构体,后面并给出了说明
struct msghdr {
void *msg_name; /* optional address 通道是数据报套接口才需要设置,执行要发送或者接受信息的套接口地址*/
socklen_t msg_namelen; /* size of address 套接口地址长度*/
struct iovec *msg_iov; /* scatter/gather array 实际的数据缓冲区*/
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data辅助数据, 通常指向结构体struct cmsghdr */
socklen_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
struct cmsghdr {
socklen_t cmsg_len; /* data byte count, including header */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by unsigned char cmsg_data[]; */
};