【发布时间】:2018-07-03 19:02:56
【问题描述】:
我目前的设置是这样的:
- 1 台电脑
- 1 x GS308v2 以太网集线器
- 7 个树莓派
给 pi 的静态 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()
接收者的python:
#!/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 的 HUB 上工作。接收者脚本给出以下错误:
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
如何配置这个集线器 x pi 网络来执行这种多播?
【问题讨论】:
-
您似乎不太可能使用集线器;这些非常罕见。你是说开关吗?
-
不,我确定。这是一个集线器:P 设备很旧。 pi 是 pi2,而不是 3,也是
-
我刚看了看,GS308 是交换机,不是集线器。交换机可以使用 IGMP 侦听,它只会将组的多播流量发送到主机已为该组发送 IGMP 加入消息的接口。您应该查看是否是这种情况,并尝试从接收方发送 IGMP 加入消息。
-
它的文档根本没有提到 IGMP。抱歉,交换机/集线器混淆了。
-
DNS 对于多播确实不是必需的。您还尝试使用保留的多播地址。您应该在组织本地范围内使用某些东西 (
239.0.0.0/8)。 IGMP 侦听几乎是交换机的默认设置,因为它可以防止多播到达不需要的地方。 IGMP 也是能够路由多播的关键,因为它告诉多播路由器主机想要接收该组的流量。多播路由与常规单播路由非常不同。
标签: python sockets networking raspberry-pi multicast