简体   繁体   English

Python 多播未在 BusyBox 上接收数据

[英]Python Multicast Not Receiving Data on BusyBox

We're trying to get our Python app to respond to a multicast request over UDP.我们正在尝试让我们的 Python 应用程序通过 UDP 响应多播请求。 We have this Python code which runs quite nicely on our Raspberry Pi running Raspian, but we've tried to port this to our BusyBox environment but it doesn't ever respond to requests (unless it's on the local subnet).我们有这个 Python 代码,它在运行 Raspian 的 Raspberry Pi 上运行得非常好,但我们已经尝试将它移植到我们的 BusyBox 环境中,但它永远不会响应请求(除非它在本地子网上)。

import socket
import struct

host = '172.20.0.56'
MCAST_GRP = '224.1.1.1'
MCAST_PORT = 49999
IS_ALL_GROUPS = True

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if IS_ALL_GROUPS:
    # on this port, receives ALL multicast groups
    sock.bind(('', MCAST_PORT))
else:
    # on this port, listen ONLY to MCAST_GRP
    sock.bind((MCAST_GRP, MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)

sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(host))

sock.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, 
                   socket.inet_aton(MCAST_GRP) + socket.inet_aton(host))
while True:
  print(sock.recv(1024))

Netstat is showing the membership group is being setup: Netstat 显示正在设置成员资格组:

$ netstat -g
IPv6/IPv4 Group Memberships
Interface       RefCnt Group
--------------- ------ ---------------------
lo              1      224.0.0.1
eth0            1      224.1.1.1

IP A shows that MULTICAST is supported on the board. IP A 显示板上支持 MULTICAST。 We can see that other machines in the group receive the messages.我们可以看到组中的其他机器收到了消息。 Is there anything else we can try?还有什么我们可以尝试的吗?

Found the answer just after posting this entry.在发布此条目后立即找到答案。

We had to change net.ipv4.conf.all.rp_filter = 2 to net.ipv4.conf.all.rp_filter = 0 in the file /usr/lib/sysctl.d/50-default.conf我们必须在文件 /usr/lib/sysctl.d/50-default.conf 中将 net.ipv4.conf.all.rp_filter = 2 更改为 net.ipv4.conf.all.rp_filter = 0

It now works as intended!它现在按预期工作!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM