Raspberry Pi Python - многоадресная передача UDP с использованием сокета не работает в локальной сети
Моя текущая настройка такова:
- 1 х компьютер
- 1 х GS308v2 Ethernet концентратор
- 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
Если кто-то захочет объяснить, почему это работает или что эта команда делает именно для сети, я буду рад узнать. Не стесняйтесь комментировать.