2

我尝试使用 netlink 套接字将二进制数据从内核空间发送到用户空间。我按照如何使用 netlink 套接字与内核模块进行通信中的示例进行操作?

但是在用户空间的接收端,我收到的数据长度大于从内核空间发送的数据长度。不过数据是一样的。数据会附加一些垃圾值。

netlink 套接字中是否不能保证接收到的数据长度与从内核空间发送的数据长度相同?

4

1 回答 1

1

您可能需要检查文档以确保正确使用“NLMSG_SPACE”、“NLMSG_PAYLOAD”和“NLMSG_DATA”等宏。

额外数据可能来自数据帧的未使用部分,并且您的程序未正确读取消息长度。(实际上,没有正确使用宏。)例如,如果您发送 1 个字节,我相信实际上会发送 4 个字节,因为NLMSG_SPACE 将四舍五入为 4 的倍数以“对齐”数据包中的数据。

读取它应该没问题,只需使用宏来获取数据的实际长度,然后只读取这么多。

这是获取指向缓​​冲区的指针和该缓冲区长度的示例。

// Get a pointer to the start of the data in the buffer and the buffer (payload) length
buf = (u_char *) (NLMSG_DATA(nlh));
len = NLMSG_PAYLOAD(nlh, 0);

以下是宏的定义。如果你愿意,看看那些。这里可能更容易理解。

您链接到的代码正在发送字符并通过“memset”将数据设置为0来摆脱它,因此打印该char数组就可以了。

希望这可以帮助。如果您无法使其正常工作,请发布一些代码。

于 2014-04-22T22:06:18.713 回答