Erlang: получить несколько многоадресных потоков на одном порту - PullRequest
3 голосов
/ 13 февраля 2012

В моей сети есть многоадресное IPTV. Все каналы имеют многоадресные адреса, например 239.0.1. *. Устройство Streamer отправляет данные 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).

Таким образом, вопрос - как определить IP-адрес назначения входящего многоадресного пакета UPD.

Windows 7, Erlang 5.9 / OTP R15B.

Спасибо!

1 Ответ

0 голосов
/ 10 мая 2012

Это должно извлечь IP-адрес назначения из полученных данных UDP:

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

Адрес будет содержать кортеж, подобный {239,0,1,3}.

...