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