你如何在Erlang中使用gen_udp进行多播? 我知道它在代码中,它背后没有文档。 发送数据显而易见且简单。 我想知道如何添加会员资格。 不仅在启动时添加成员资格,而且在运行时添加成员资格也很有用。

===============>>#1 票数:14 已采纳

以下是有关如何收听Bonjour / Zeroconf流量的示例代码。

-module(zcclient).

-export([open/2,start/0]).
-export([stop/1,receiver/0]).

open(Addr,Port) ->
   {ok,S} = gen_udp:open(Port,[{reuseaddr,true}, {ip,Addr}, {multicast_ttl,4}, {multicast_loop,false}, binary]),
   inet:setopts(S,[{add_membership,{Addr,{0,0,0,0}}}]),
   S.

close(S) -> gen_udp:close(S).

start() ->
   S=open({224,0,0,251},5353),
   Pid=spawn(?MODULE,receiver,[]),
   gen_udp:controlling_process(S,Pid),
   {S,Pid}.

stop({S,Pid}) ->
   close(S),
   Pid ! stop.

receiver() ->
   receive
       {udp, _Socket, IP, InPortNo, Packet} ->
           io:format("~n~nFrom: ~p~nPort: ~p~nData: ~p~n",[IP,InPortNo,inet_dns:decode(Packet)]),
           receiver();
       stop -> true;
       AnythingElse -> io:format("RECEIVED: ~p~n",[AnythingElse]),
           receiver()
   end. 

===============>>#2 票数:10

已回答多播发送,接收需要订阅多播组。

它(仍然)似乎没有记录,但之前已经在erlang-questions邮件列表中进行了介绍。 http://www.erlang.org/pipermail/erlang-questions/2003-March/008071.html

    {ok, Socket} = gen_udp:open(Port, [binary, {active, false},
                                       {reuseaddr, true},{ip, Addr}, 
                                       {add_membership, {Addr, LAddr}}]).

其中Addr是多播组, LAddr是本地接口。 (代码由mog提供)

上面使用的相同选项可以传递给inet:setopts包括{drop_membership, {Addr, LAddr}}以停止收听该组。

===============>>#3 票数:4

我试着在我的电脑上运行这个例子。 如果我通过打开接收套接字始终得到消息{error,eaddrnotavail},会发生什么?

示例1:这有效:

{ok, Socket} = gen_udp:open(?PORT, [{reuseaddr,true}, {ip,?SERVER_IP},
               {multicast_ttl,4}, {multicast_loop,false}, binary]),

示例2:获取运行时错误:

{ok, Socket} = gen_udp:open(?PORT, [{reuseaddr,true}, {ip,?MULTICAST_IP},
               {multicast_ttl,4}, {multicast_loop,false}, binary]),

% - > {error,eaddrnotavail}

-define(SERVER_IP, {10,31,123,123}). % The IP of the current computer
-define(PORT, 5353).
-define(MULTICAST_IP, {224,0,0,251}). 

===============>>#4 票数:0

组播由IP地址指定

它在erlang中与所有语言相同。 IP地址224.0.0.0到239.255.255.255是多播地址。

选择该范围内的地址,检查您是否与已分配的地址重叠,并且您很高兴。

http://www.iana.org/assignments/multicast-addresses

  ask by Sargun Dhillon translate from so

未解决问题?本站智能推荐:

1回复

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

我的网络中有一个基于组播的IPTV。 所有频道都有像239.0.1。*这样的多播地址。 流媒体设备将UDP数据发送到目标端口1234.因此,为了接收电视流,我通常会这样做: 有用。 现在我想订阅多个频道同时接收多个流。 所以我再打一次电话: 它也有效。 我在Wire
2回复

双向UDP组播

我正在为游戏服务器编写网络后端。 我计划使用多播,以便客户端可以通过多播套接字绑定到服务器。 然后,服务器可以将游戏更新发送给该组的所有成员。 但是,我想知道是否可以做相反的工作 -客户端可以通过与多播套接字相同的端口将单播数据发送到服务器吗? 我已经基于Java教程 (仅发
2回复

组播数据开销?

我的应用程序使用UDP的多播功能。 简而言之,我正在使用Java,并希望使用单个多播地址和端口传输所有数据。 尽管多播侦听器将在逻辑上划分为多个子组,这些子组可以在运行时更改,并且可能不希望处理来自其组外部的数据。 为此,我编写了代码,以便所有正在运行的应用程序实例将加入相同的多播
1回复

在第2层组播

请原谅我有限的网络知识。 我正在尝试设置两个小的程序作为客户端和服务器,它们加入了特定的多播组。 服务器向该组发送一些任意数据,而客户端在侦听该组时会接收数据。 我已经完成的UDP程序当然可以做到这一点。 但是,我需要使用MAC地址而不是IP 。 我对此有一些疑问:
1回复

组播丢弃大量消息

我目前正在开发一种在办公环境中运行的服务,并且我目前正在尝试利用UPnP来发现和管理该服务-将在5到45台设备上运行。 在测试中,我使用了两个运行Android 8.0.0的三星设备。 广播地址239.255.255.250端口1900 我正在运行Wireshark,正在观察通过网
2回复

从不同端口接收组播

基本上我有一个应用程序在同一个接口和同一个应用程序中创建5个多播套接字,每个套接字绑定到不同的多播IP地址/端口。 当这些套接字中的任何一个发送消息时,应用程序中的其他4个套接字最终会读取该消息。 这是正常的行为吗? 这是在Ubuntu 11.10中使用boost.asio和gcc 4
1回复

不同网络上的UDP组播

我正在尝试向连接到本地网络/相同路由器的不同客户端发送一条简单消息。 但是可能客户端可能连接到不同的路由器并且具有不同的IP地址,因此我正在使用范围从224.0.0.0到230.255.255.255的UDP广播组和特定的端口号。 当前,当我在同一网络中时,可以向这些客户端发送消息,但是当它
1回复

组播套接字丢包

我用C编程语言编写了简单的多播服务器和客户端程序。 然后,我通过以太网接口将服务器连接到启用了多播的路由器(支持dd-wrt)。 客户端通过无线接口连接到路由器。 我每10毫秒将数据包从服务器发送到客户端。 数据包大小为512字节。 问题是客户端仅收到40%的数据包,我在Wiresha
1回复

组播服务器接收发送的相同数据

我正在尝试允许连接到UDP服务器的客户端将数据包发送到服务器,我正在运行服务器,以便可以将数据包发送到客户端,但是尝试通过客户端将数据包发送回服务器似乎会创建一些奇怪的错误。 如果我启动服务器,然后打开一个客户端,则客户端将接收到来自服务器的第一个数据包,然后客户端尝试将数据包发送到服务器
3回复

无法分配请求的地址:Python组播

我刚开始联网,正在编写一个非常简单的多播代码。 我仍然不确定不同的接口。 一些示例使用“ 0.0.0.0”,而另一些示例使用“ 127.0.0.1”。 服务器代码 客户代码 客户端代码正常运行,正在等待在套接字上接收消息。 但是,只要我输入任何消息,代码服务器就会崩溃