Erlang Multicast

comment utilisez-vous gen_udp dans Erlang pour faire de la multidiffusion? Je sais que c'est dans le code, mais il n'y a aucune documentation derrière. Envoyer des données est évident et simple. Je me demandais comment ajouter des adhésions. Non seulement ajouter des adhésions au démarrage, mais ajouter des adhésions en cours d'exécution serait également utile.

16
demandé sur Sargun Dhillon 2008-09-17 05:06:59

4 réponses

voici un exemple de code sur la façon d'écouter sur Bonjour / Zeroconf traffic.

-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. 
14
répondu feeling abused and harassed 2009-11-16 04:36:03

L'envoi Multicast a été répondu, la réception nécessite un abonnement au groupe multicast.

It (still) semble non documenté, mais a déjà été couvert sur la liste de diffusion 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 est le groupe de multidiffusion, et LAddr est une interface locale. (code gracieuseté de mog)

les mêmes options utilisées ci-dessus peuvent être passées à inet:setopts{drop_membership, {Addr, LAddr}} arrêter d'écouter le groupe.

10
répondu Bwooce 2011-12-13 06:34:05

j'essaie de faire tourner cet exemple sur mon PC. Que pourrait-il se passer, si je reçois toujours le message {error,eaddrnotavail} en ouvrant la prise de réception?

exemple 1: cela fonctionne:

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

Exemple 2: préparation d'une Erreur à l'exécution:

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

% --> {erreur,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
répondu Matthias 2009-12-10 10:49:23

Multicast est spécifié par adresse IP

c'est la même chose en erlang que pour toutes les langues. Les adresses IP 224.0.0.0 à 239.255.255.255 sont des adresses multicast.

Choisissez une adresse dans cette plage, vérifiez que vous ne chevauchez pas une adresse déjà assignée, et vous êtes prêt à y aller.

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

0
répondu Mark Harrison 2008-09-17 01:18:29