多播

时间:2015-10-14 09:12:34

标签: sockets router multicast loopback

这个问题是关于在同一主机内发送和接收多播,同时将其发送到其他主机。

即使经过数小时的谷歌搜索,我也无法理清多播数据报如何在同一主机中路由..!

以下是问题的详细说明:

Linux框“A”通过电缆连接到交换机/路由器(让我们将交换机/路由器称为“R”)。

在linux框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”命令?

套接字是进程A1和A2设置了以下标志:

SO_REUSEADDR
SO_REUSEPORT

虽然我已经检查过程A0(发送多播数据报的那个)有以下标志:

IP_MULTICAST_LOOP

2 个答案:

答案 0 :(得分:2)

循环回本地进程(本地套接字)应该可以在不向lo添加组播路由的情况下工作。只需确保您有一个有用的路由设置为某个外部接口。数据包仍将在内部路由。 (Linux在幕后进行了大量的路由。)

你需要IP_MULTICAST_LOOP,看起来不错。

您是否在所有进程中正确加入了多播组? IP_ADD_MEMBERSHIP?如果没有这个,你会得到各种虚假的行为。

您可以查看本地路由表,了解Linux在本地对数据包执行的操作。它通常远非琐碎:

sudo ip route show table local

您还可以查看当前的多播组成员身份:

netstat -g

输出和引用计数在您的情况下是否有意义?

答案 1 :(得分:1)

Firs配置您的网络适配器:

ifconfig lo 127.0.0.1 netmask 224.0.0.0 up

然后遵循以下代码: / 发送 /

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 &