我在我的网络中有一个基于多播的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。
谢谢!