Python Multicast не получает данные на BusyBox - PullRequest
0 голосов
/ 17 января 2020

Мы пытаемся заставить наше приложение Python отвечать на многоадресный запрос по UDP. У нас есть Python код, который прекрасно работает на нашем Raspberry Pi с Raspian, но мы пытались перенести его в нашу среду BusyBox, но он никогда не отвечает на запросы (если он не находится на локальном su bnet) .

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 показывает, что настраивается группа участников:

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

IP A показывает, что MULTICAST поддерживается на плате. Мы видим, что другие машины в группе получают сообщения. Мы можем попробовать что-нибудь еще?

1 Ответ

0 голосов
/ 17 января 2020

Нашел ответ сразу после публикации этой записи.

Нам пришлось изменить net .ipv4.conf.all.rp_filter = 2 на net .ipv4.conf.all.rp_filter = 0 в файл /usr/lib/sysctl.d/50-default.conf

Теперь он работает как задумано!

...