Raspberry Pi Python - многоадресная передача UDP с использованием сокета не работает в локальной сети

Моя текущая настройка такова:

  1. 1 х компьютер
  2. 1 х GS308v2 Ethernet концентратор
  3. 7 х малины пи

Пи получают статические ip в диапазоне от 192.168.1.2 до 192.168.1.9. Файл dhcpcd.conf выглядит следующим образом:

Скрипт Python для отправителя:

#!/usr/bin/python

import socket
import struct
import sys
import IN
import subprocess
import fcntl

MULTICAST_GROUP = '224.1.1.1'
MULTICAST_PORT = 12345

path = "-o /var/www/html/images-folder/pic.jpg"

SCMD = chr(1)
SEND = SCMD + path
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
dev = "eth0" + "\0"
sock.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, dev)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto(SEND, (MULTICAST_GROUP, MULTICAST_PORT))
sock.close()

Питон для ресивера:

#!/usr/bin/python

import socket
import struct
import fcntl
from subprocess import call
import sys

MULTICAST_GROUP = '224.1.1.1'
MULTICAST_PORT = 12345

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MULTICAST_PORT))
req = struct.pack("4sl", socket.inet_aton(MULTICAST_GROUP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, req)

while True:
   data = sock.recv(10240)

Это все работает с динамическими IP на маршрутизаторе. Но не работает на хабе со статическими ip. Сценарий получателя выдает следующую ошибку:

Traceback (most recent call last):
  File "/home/pi/dummyPi.py", line 17, in <module>
    sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, req)
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 19] No such device

Как можно настроить эту сеть хаб-хи для выполнения этой многоадресной рассылки?

1 ответ

Решение оказалось, что маршрутизация для многоадресной рассылки также должна быть настроена для Linux, если не используется маршрутизатор. Следующая команда спасла меня:

sudo ip route add 224.0.0.0/4 dev eth0

Если кто-то захочет объяснить, почему это работает или что эта команда делает именно для сети, я буду рад узнать. Не стесняйтесь комментировать.

Другие вопросы по тегам