Frage

Wie verwenden Sie in Erlang gen_udp Multicasting zu tun? Ich weiß, dass seine im Code, da dahinter nur keine Dokumentation. Senden von Daten aus ist klar und einfach. Ich habe mich gefragt, wie Mitgliedschaften hinzuzufügen. Nicht nur Mitgliedschaften bei der Inbetriebnahme des Hinzufügen, aber Mitgliedschaften Hinzufügen beim Laufen auch nützlich wäre.

War es hilfreich?

Lösung

Hier ist Beispielcode, wie auf Bonjour / Zeroconf Verkehr mithören.

-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. 

Andere Tipps

Multicast beantwortet wurde das Senden, den Empfang benötigt, um die Multicast-Gruppe zu erhalten.

Es (noch) scheint nicht dokumentiert, sondern hat sich auf die erlang-Fragen Mailingliste abgedeckt vor. http://www.erlang.org/pipermail/erlang- Fragen / 2003-März / 008071.html

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

, wo der Addr ist die Multicast-Gruppe, und LAddr ist eine lokale Schnittstelle. (Code mit freundlicher Genehmigung von mog)

Die gleichen Optionen oben können verwendet werden, übergeben an inet:setopts einschließlich {drop_membership, {Addr, LAddr}} die Gruppe hören zu stoppen.

Ich versuche, diesem Beispiel zu bekommen auf meinem PC läuft. Was könnte passieren, wenn ich immer die Meldung {Fehler, EADDRNOTAVAIL} durch den Empfang Buchse öffnen?

Beispiel 1: Das funktioniert:

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

Beispiel 2: Erste einen Laufzeitfehlers:

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

% -> {Fehler, EADDRNOTAVAIL}

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

Multicast angegeben durch IP-Adresse

Es ist das gleiche in erlang wie für alle Sprachen. Die IP-Adressen 224.0.0.0 bis 239.255.255.255 sind Multicast-Adressen.

Wählen Sie eine Adresse in diesem Bereich sicherstellen, dass Sie nicht eine bereits zugewiesene Adresse überlappen, und Sie sind gut zu gehen.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top