msghdr和cmsghdr学习

在这里插入图片描述
在这里插入图片描述

在网络编程中,`struct msghdr` `struct nlmsghdr` 通常用于在用户空间内核空间之间高效地传递数据,尤其是在使用 Netlink 套接字进行通信时。`struct msghdr` 提供了对数据缓冲区、地址信息控制信息的管理功能,而 `struct nlmsghdr` 是 Netlink 协议专用的消息头部结构,用于封装 Netlink 消息的元数据有效载荷[^1]。 ### 数据结构配合方式 `struct msghdr` 用于描述整个消息的布局,包括目的地址、数据缓冲区控制信息。`struct nlmsghdr` 则作为 `struct msghdr` 中 `msg_iov` 所指向的数据缓冲区的一部分,用于承载 Netlink 消息的头部实际数据。这种组合方式允许在单次系统调用中发送或接收完整的 Netlink 消息,包括地址信息附加控制信息。 - `struct msghdr` 的 `msg_name` 字段指向一个 `struct sockaddr_nl` 结构,用于指定目标地址或接收源地址。 - `struct msghdr` 的 `msg_iov` 字段指向一个 `struct iovec` 结构,其 `iov_base` 成员指向 `struct nlmsghdr` 类型的缓冲区,用于承载 Netlink 消息。 - `struct nlmsghdr` 的 `nlmsg_len` 字段定义了整个 Netlink 消息的长度,包括头部数据部分,使得接收方能够正确解析消息内容。 ### 使用示例 以下是一个典型的 `struct msghdr` `struct nlmsghdr` 配合使用的示例: ```c struct sockaddr_nl nladdr; struct msghdr msg; struct iovec iov; struct nlmsghdr *nlhdr; char buffer[1024]; // 初始化 sockaddr_nl memset(&nladdr, 0, sizeof(nladdr)); nladdr.nl_family = AF_NETLINK; nladdr.nl_pid = 0; // 发送给内核 nladdr.nl_groups = 0; // 初始化 msghdr memset(&msg, 0, sizeof(msg)); msg.msg_name = (void *)&nladdr; msg.msg_namelen = sizeof(nladdr); // 初始化 nlmsghdr nlhdr = (struct nlmsghdr *)malloc(NLMSG_SPACE(1024)); if (!nlhdr) { // 处理内存分配失败 } nlhdr->nlmsg_len = NLMSG_LENGTH(strlen("Hello Kernel") + 1); nlhdr->nlmsg_type = NLMSG_DONE; nlhdr->nlmsg_flags = 0; nlhdr->nlmsg_seq = 0; nlhdr->nlmsg_pid = getpid(); strcpy(NLMSG_DATA(nlhdr), "Hello Kernel"); // 初始化 iovec iov.iov_base = (void *)nlhdr; iov.iov_len = nlhdr->nlmsg_len; msg.msg_iov = &iov; msg.msg_iovlen = 1; // 创建 Netlink 套接字 int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TEST); if (fd < 0) { // 处理套接字创建失败 } // 发送消息 if (sendmsg(fd, &msg, 0) < 0) { // 处理发送失败 } free(nlhdr); close(fd); ``` ### 数据解析 在接收端,`struct msghdr` 用于接收包含 `struct nlmsghdr` 的数据包。接收方可以通过 `msg_iov` 中的 `iov_base` 指针访问 `struct nlmsghdr`,并使用 `nlmsg_len` `NLMSG_DATA` 宏提取数据内容。这种方式确保了数据的完整性可解析性,同时支持多段缓冲区控制信息的传递。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值