Erlang:在同一端口上接收多个组播流

4

我在我的网络中有一个基于多播的IPTV。 所有频道都有类似239.0.1.*的多播地址。 流媒体设备通过UDP数据发送到目标端口1234。 所以,要接收电视流,我需要做一些常规操作:

{ok, S} = gen_udp:open(1234, ....
inet:setopts(S, [{add_membership, {{239,0,1,2}, {0,0,0,0}}}]),

它可以工作。

现在我想要订阅多个频道以同时接收多个流。 所以我再做一个调用:

inet:setopts(S, [{add_membership, {{239,0,1,3}, {0,0,0,0}}}]),

这也可以实现。我在Wireshark中看到了两个数据流。通过目标IP地址 - 239.0.1.2和239.0.1.3,我可以将它们区分开。

但是。

在Erlang中,我无法确定传入的数据包属于哪个通道,因为UDP数据以消息形式到达:

{udp, Socket, IP, PortNo, Packet},

在我的情况下,IP和PortNo是源地址(10.33.33.32)和端口(49152)。那么问题来了 - 如何确定传入的多播UPD数据包的目标IP地址。

Windows 7,Erlang 5.9/OTP R15B。

谢谢!


如果你在这里得不到答案,你可以考虑在erlang-questions上提问。 - Peer Stritzinger
阅读此链接:https://dev59.com/8krSa4cB1Zd3GeqPVllu - Ricardo
Ricardo,一开始我以为你发了一个链接来指引我找到答案。但现在我猜想你是想让我给你提供建议。不幸的是,我无法帮助你。 - 3DFace
1个回答

0

这应该从接收到的UDP数据中检索目标IP:

{udp, Socket, IP, PortNo, Packet},
{ok, {Address, Port}} = inet:sockname(Socket),

地址将包含类似于 {239,0,1,3} 的元组。


很不幸,它并没有。地址包含我的真实IP地址(194.x.x.88),而不是多播组地址。 - 3DFace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接