2017-04-17 71 views
-1

我想设置一个程序,通过本地网络传输我的摄像头,但我遇到了一些问题。我用C++编写了一个程序,它使用OpenCV从我的摄像头捕捉图像,然后获取字节并使用多播将它转换为IP。然后我有一个Java程序监听这个IP地址。树莓派路由器上的多点传送

在我的路由器创建的通常网络上,一切正常,我可以将我的摄像头流式传输到多台计算机上。问题是,我将Raspberry Pi设置为路由器(使用此link),并且每当我在网络上创建树莓派时,我都无法组播。

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

异常在线程 “主” java.net.SocketException异常:在 java.net.PlainDatagramSocketImpl.join(本机方法)在 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,但是这是由发送者设置的,是正确的吗?如果是这样,这应该不是问题,因为我在两个网络上使用同一台计算机。

感谢您的帮助!

+0

组播限于广播域,除非你使用组播路由,这是非常不同于单播路由。您需要特殊的软件来响应IGMP,并且如果需要路由器到路由器的多播路由,则需要使用PIM。 –

+0

我确实想要使用多播:需要发送给多个接收者,不关心包是否丢失(在某种程度上),并且我并不总是知道哪些计算机将发送/接收数据(正如所说的如果他们符合,我愿意接受其他选择)。 我不认为我需要路由器到路由器的通信。我只需要能够在同一网络上多播到其他计算机。问题是当我使用路由器(即arris路由器)多播与我的程序一起使用时。当我使用Linux计算机作为路由器(上面的链接)时,它不起作用。如果它在同一个网络上,我需要其他软件吗? –

+0

你需要你的路由器使用IGMP。现代交换机不会将组播信息泛滥到每个接口,他们会监听主机和组播路由器之间的IGMP对话,以确定哪些接口应该接收组播。在不使用IGMP的路由器另一端的接收器永远不能让路由器源端的交换机向路由器发送多播。 –

回答

0

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

首先,由于我使用Raspberry Pi作为路由器,因此必须路由来自any interface to my wireless interface的多播数据包。在我的例子中,我跑了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