【问题标题】:Raspberry Pi Python - Multicasting UDP using Socket not working on local networkRaspberry Pi Python - 使用套接字的多播 UDP 在本地网络上不起作用
【发布时间】:2018-07-03 19:02:56
【问题描述】:

我目前的设置是这样的:

  1. 1 台电脑
  2. 1 x GS308v2 以太网集线器
  3. 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


【解决方案1】:

结果证明,如果不使用路由器,则还必须为 Linux 设置多播路由。以下命令救了我:

sudo ip route add 224.0.0.0/4 dev eth0

如果有人想解释为什么它会起作用或者这个命令对网络有什么作用,我很乐意学习。欢迎发表评论。

【讨论】:

    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 2014-12-21
    • 2021-12-19
    • 1970-01-01
    • 2021-06-27
    • 2021-11-28
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多