【发布时间】: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