【问题标题】:Multicasting on Raspberry Pi routerRaspberry Pi 路由器上的多播
【发布时间】:2017-04-17 22:20:25
【问题描述】:

我正在尝试设置一个程序,通过本地网络传输我的网络摄像头,但我遇到了一些问题。我用 C++ 编写了一个程序,它使用 OpenCV 从我的网络摄像头捕获图像,然后我获取字节并使用多播将其转换为 IP。然后我有一个 Java 程序来监听这个 IP 地址。

在我的路由器创建的常用网络上,一切正常,我可以将我的网络摄像头流式传输到多台计算机。问题是,我已经设置了一个树莓派作为路由器(使用这个link),每当我在网络上创建树莓派时,我都无法进行多播。

在 C++ 程序中,我使用 sys/socket.h 中的“sendto”来发送数据,它返回 -1,错误为 Network is unreachable。当我尝试使用 java 程序监听 IP 时,出现以下错误。

线程“main”中的异常 java.net.SocketException:没有这样的设备 java.net.PlainDatagramSocketImpl.join(Native Method) 在 java.net.AbstractPlainDatagramSocketImpl.join(AbstractPlainDatagramSocketImpl.java:178) 在 java.net.MulticastSocket.joinGroup(MulticastSocket.java:323) 在 MulticastImageReciever.(MulticastImageReciever.java:29) 在 MulticastImageReciever.main(MulticastImageReciever.java:118)

如果需要,我可以发布我编写的程序,但由于它可以在其他网络上运行,我认为这不是问题。对于如何解决这个问题,有任何的建议吗?

我能找到的唯一帮助是link,它说使用多播时的一个常见问题是 TTL 设置为 1,但这是由发送者设置的,对吗?如果是这样,这应该不是问题,因为我在两个网络上都使用同一台计算机。

感谢您的帮助!

【问题讨论】:

  • 组播仅限于广播域,除非您使用组播路由,这与单播路由有很大不同。你需要专门的软件来响应IGMP,如果你需要路由器到路由器的组播路由,你需要使用PIM。
  • 我确实想使用多播:需要发送给许多接收者,不在乎包裹是否丢失(在一定程度上),而且我并不总是知道将发送哪些计算机/接收数据(话虽如此,如果他们满足,我愿意接受其他选择)。我认为我不需要路由器到路由器的通信。我只需要能够多播到同一网络上的其他计算机。问题是当我使用路由器(即 arris 路由器)时,多播适用于我的程序。当我将 Linux 计算机用作路由器(上面的链接)时,它不起作用。如果它在同一个网络上,我需要其他软件吗?
  • 您的路由器需要使用 IGMP。现代交换机不会将组播泛洪到每个接口,它们会侦听主机和组播路由器之间的 IGMP 对话,以确定哪些接口应该接收组播。路由器另一端不使用 IGMP 的接收器将永远无法让路由器源端的交换机将多播发送到路由器。
  • 组播路由与单播路由有很大不同,需要专门的软件。

标签: java c++ linux networking raspberry-pi


【解决方案1】:

如果有人在提交的帮助下遇到类似问题,我找到了解决方案。

首先,由于我将 Raspberry Pi 用作路由器,因此我必须从 any interface to my wireless interface 路由多播数据包。在我的 pi 上,我运行了route add –net 224.0.0.0 netmask 240.0.0.0 gw wlan0。这允许路由器使用 IGMP。

其次,Linux 2.6 之后的内核replying to broadcast/multicast is disabled by default。要更改此echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    相关资源
    最近更新 更多