此问题是关于在同一主机内发送和接收组播,同时将其发送到其他主机。
即使经过几个小时的谷歌搜索,我也无法理清多播数据报是如何在同一主机内路由的。
下面是问题的详细描述:
Linux机器"A“通过电缆连接到交换机/路由器(让我们将交换机/路由器称为"R")。
在linux box A中,我有一个进程(A0),它将UDP包发送到多播地址"224.0.0.0",端口5000。
同样,在同一个机器A中,我有两个进程(A1和A2),这两个进程都连接到224.0.0.0端口5000并使用UDP数据包。
现在,A盒中的内核如何管理路由?
因此,A0发送一个由A1和A2使用的数据报。这样的数据报做往返A --> R --> A吗?
。。还是"A“中的内核路由足够智能,可以避免这种不必要的往返?(即数据报由A0发送,并由A1和A2立即使用,从不离开A)。
当然,通过创建和执行用于组播的环回设备,可以确保组播数据报永远不会离开A:
sudo ifconfig lo multicast
sudo route add -net 224.0.0.0 netmask 240.0.0.0 dev lo
但是现在,如果我想在另一个linux机器上同时使用UDP数据报,比如"B",它们就不可能到达那里。
因此,理想情况下,(1)在A中使用的数据报不应该离开A(即没有往返A --> R --> A),而(2)在B中使用的数据报应该以A --> R --> B的形式正常运行。我希望同时实现这两件事。
有什么方法可以实现这一点吗,例如,使用"route“命令?
套接字is进程A1和A2设置了以下标志:
SO_REUSEADDR
SO_REUSEPORT
虽然我已经检查到进程A0 (发送多播数据报的进程)具有以下标志on:
IP_MULTICAST_LOOP
发布于 2015-10-22 07:02:27
返回到本地进程(本地套接字)的循环应该可以工作,而不需要向lo添加多播路由。只需确保设置了到某个外部接口的有用路由即可。数据包仍将在内部路由。(Linux在幕后执行大量路由。)
你需要IP_MULTICAST_LOOP,这看起来不错。
您是否在所有进程中都正确地加入了组播组?IP_ADD_MEMBERSHIP?没有这一点,你会得到各种虚假的行为。
您可以查看本地路由表,了解Linux在本地对数据包执行的操作。这通常不是微不足道的:
sudo ip route show table local
您还可以查看当前的组播组成员身份:
netstat -g
在您的例子中,输出和ref计数有意义吗?
发布于 2019-01-08 21:42:31
Firs配置您的网络适配器:
ifconfig lo 127.0.0.1 netmask 224.0.0.0 up
然后遵循以下代码: /send/
gst-launch-1.0 -v imxv4l2videosrc device=/dev/video0 ! imxvpuenc_h264 bitrate=10000 ! rtph264pay ! udpsink host=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo force-ipv4=true sync=false &
/接收/
gst-launch-1.0 udpsrc multicast-group=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo ! application/x-rtp ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink framebuffer=/dev/fb0 sync=false &
gst-launch-1.0 udpsrc multicast-group=224.0.0.0 port=5000 auto-multicast=true multicast-iface=lo ! application/x-rtp ! rtph264depay ! h264parse ! imxvpudec ! imxipuvideosink framebuffer=/dev/fb2 sync=false &
https://stackoverflow.com/questions/33121208
复制相似问题