2012-02-13 3 views
2

У меня в сети есть многоадресный IPTV. Все каналы имеют адреса мутирования, такие как 239.0.1. *. Streamer устройство отправляет UDP данные в порт назначения 1234. Таким образом, чтобы получить поток ТВ я обычные вещи, как:Erlang: получать несколько многоадресных потоков на одном и том же порту

{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}}}]), 

Это тоже работает. Я вижу оба потока в Вирешарке. Я могу различать их по 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.

Спасибо!

+0

Если вы не получили ответа, вы можете попросить об этом на erlang-questions. –

+0

Читайте это: http://stackoverflow.com/questions/1746257/how-to-send-multicast-messages-and-reuse-a-port-in-erlang – Ricardo

+0

Рикардо, сначала я думал, что вы разместите ссылку на пункт я к ответу. Но теперь, я думаю, вы хотели, чтобы я дал вам совет. К сожалению, я не могу вам помочь. – 3DFace

ответ

0

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

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

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

+0

К сожалению, это не так. Адрес содержит мой реальный IP-адрес (194.x.x.88), а не групповой адрес группы. – 3DFace

Смежные вопросы