内核高于4的Python Netlink多播通信

内核高于4的Python Netlink多播通信,python,c,linux-kernel,multicast,netlink,Python,C,Linux Kernel,Multicast,Netlink,我试图在4(4.1)以上的内核上重现上一个示例: 我甚至不知道在哪里可以找到错误代码来学习,-3在这个上下文中是什么意思(我搜索了,但是找不到任何有用的错误代码) 为了确保这一点,我还发布了userland代码(Python): 因评论而编辑:(但仍不工作) 您忘了绑定套接字。:-) 我对Python不是很熟练,因此仅将此作为起点(在socket和setsockopt之间): 那给我印了一堆垃圾,我可以看到 Hello from kernel 顺便说一下:当nlmsg\u multicast

我试图在4(4.1)以上的内核上重现上一个示例:

我甚至不知道在哪里可以找到错误代码来学习,-3在这个上下文中是什么意思(我搜索了,但是找不到任何有用的错误代码)

为了确保这一点,我还发布了userland代码(Python):

因评论而编辑:(但仍不工作)


您忘了绑定套接字。:-)

我对Python不是很熟练,因此仅将此作为起点(在
socket
setsockopt
之间):

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

Hello from kernel

顺便说一下:当
nlmsg\u multicast()
抛出
ESRCH
时,通常(或者可能总是)是因为没有客户端在侦听

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


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

大多数出现错误的内核函数返回值
-
,在用户空间中通常称为
errno
EINVAL
ENOMEM
等等)。在内核中,错误代码在中定义。也就是说,返回值
-3
对应于
ESRCH
错误。这是我不知道的事情,谢谢!你还知道,为什么在我的两个项目中会发生这种情况吗?对于您明确提到的问题,用户空间中简单的
bind()
不足以绑定给定的多播ID。您需要使用
setsockopt
注册此组的成员身份。再次感谢您的回复,很抱歉没有立即响应,我必须测试一些东西。但是,我尝试了setsockopt,如下所示:sock.setsockopt(270,1,31)。270是SOL_NETLINK,1是NETLINK_ADD_会员。它根本不起作用:(非常感谢,伙计。这并不是我想要的答案(也用bind()做了很多尝试;-))。但是你帮了我很多。错误是,我在setsockopt()之后调用了bind()。现在它起作用了。如果可以,我会给你100票;-)@user1252280您能告诉我如何解决“打印一堆垃圾”字符的问题吗,因为当我打印时,我也会得到像“\x00\x00\Hello from kernel\x00\x00\x00\”这样的输出。我试过解码(“utf-8”),但也没用。谢谢
nlmsg_multicast() error: -3
#!/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'
sock.bind((0, 0))
Hello from kernel