以上内核中的Python Netlink多播通信

我试图在4(4.1)以上的内核上重现先前SOpost中的示例:

#include  #include  #include  #include  #include  /* Protocol family, consistent in both kernel prog and user prog. */ #define MYPROTO NETLINK_USERSOCK /* Multicast group, consistent in both kernel prog and user prog. */ #define MYGRP 31 static struct sock *nl_sk = NULL; static void send_to_user(void) { struct sk_buff *skb; struct nlmsghdr *nlh; char *msg = "Hello from kernel"; int msg_size = strlen(msg) + 1; int res; pr_info("Creating skb.\n"); skb = nlmsg_new(NLMSG_ALIGN(msg_size + 1), GFP_KERNEL); if (!skb) { pr_err("Allocation failure.\n"); return; } nlh = nlmsg_put(skb, 0, 1, NLMSG_DONE, msg_size + 1, 0); strcpy(nlmsg_data(nlh), msg); pr_info("Sending skb.\n"); res = nlmsg_multicast(nl_sk, skb, 0, MYGRP, GFP_KERNEL); if (res < 0) pr_info("nlmsg_multicast() error: %d\n", res); else pr_info("Success.\n"); } static int __init hello_init(void) { pr_info("Inserting hello module.\n"); nl_sk = netlink_kernel_create(&init_net, MYPROTO, NULL); if (!nl_sk) { pr_err("Error creating socket.\n"); return -10; } send_to_user(); netlink_kernel_release(nl_sk); return 0; } static void __exit hello_exit(void) { pr_info("Exiting hello module.\n"); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL"); 

但是,编译工作正常,但是当我插入模块时,它返回:

 nlmsg_multicast() error: -3 

我甚至不知道,在哪里可以查找错误代码来学习,在这种情况下-3意味着什么(我在这里搜索,但是找不到任何有用的,关于错误代码)。

只是为了确定,我也发布了userland代码(Python):

由于评论而被编辑:(但仍然无效)

 #!/usr/bin/env python import socket import os import time sock = socket.socket(socket.AF_NETLINK, socket.SOCK_DGRAM, socket.NETLINK_USERSOCK) # 270 is SOL_NETLINK and 1 is NETLINK_ADD_MEMBERSHIP sock.setsockopt(270, 1, 31) while 1: try: print sock.recvfrom(1024) except socket.error, e: print 'Exception' 

你忘了绑定套接字了。 🙂

我对Python不太熟悉,所以只能将它作为起点(在socketsetsockopt ):

 sock.bind((0, 0)) 

这给我打了一堆垃圾,其中我可以看到

 Hello from kernel 

顺便说一句:当nlmsg_multicast()抛出ESRCH ,它通常(或者可能总是)因为没有客户nlmsg_multicast()在侦听。

首先打开客户端, 然后尝试从内核发送消息。

否则,您始终可以忽略对您的用例有意义的错误代码。