gpt4 book ai didi

4 以上内核中的 Python Netlink 组播通信

转载 作者:行者123 更新时间:2023-11-28 22:38:11 26 4
gpt4 key购买 nike

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

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netlink.h>
#include <net/netlink.h>
#include <net/net_namespace.h>

/* 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 在此上下文中的含义(我搜索了 here,但找不到任何关于错误代码的有用信息)。

为了确定,我还发布了用户空间代码(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'

最佳答案

您忘记绑定(bind)套接字。 :-)

我对 Python 不是很流利,因此仅将其用作起点(在 socketsetsockopt 之间):

sock.bind((0, 0))

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

Hello from kernel

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

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

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

关于4 以上内核中的 Python Netlink 组播通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35876323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com