netlink套接字中的msg不正确

时间:2014-04-19 13:20:59

标签: sockets linux-device-driver netlink

我尝试使用netlink socket将内核空间的二进制数据发送到用户空间。我按照How to use netlink socket to communicate with a kernel module?

中的示例进行了操作

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

netlink socket中是否无法保证接收到的数据长度与从内核空间发送的数据相同?

1 个答案:

答案 0 :(得分:1)

您可能需要查看文档以确保使用的是" NLMSG_SPACE"," NLMSG_PAYLOAD"和" NLMSG_DATA"等宏。正确。

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

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

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

// 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);

Here are the definitions of the macros.如果你想要的话,看看那些。 This here is probably more understandable.

您链接到的代码是发送字符并通过" memset"将数据转换为0,因此打印该char数组就可以了。

希望这会有所帮助。如果您无法使用,请发布一些代码。