2008-09-17 16 views
16

मल्टीकास्टिंग करने के लिए आप एरलांग में gen_udp का उपयोग कैसे करते हैं? मैं इसे कोड में जानता हूं, इसके पीछे कोई दस्तावेज नहीं है। डेटा भेजना स्पष्ट और सरल है। मैं सदस्यता जोड़ने के बारे में सोच रहा था। न केवल स्टार्ट-अप पर सदस्यता जोड़ना, बल्कि चलते समय सदस्यता जोड़ना भी उपयोगी होगा।एरलांग मल्टीकास्ट

उत्तर

14

यहां बोनजोर/जेरोकॉन्फ़ यातायात पर सुनने के लिए उदाहरण कोड है।

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

मल्टीकास्ट आईपी पता

यह सभी भाषाओं के लिए के रूप में erlang में ही है द्वारा निर्दिष्ट किया जाता। आईपी ​​पते 224.0.0.0 के माध्यम से 23 9.255.255.255 मल्टीकास्ट पते हैं।

उस सीमा में एक पता चुनें, जांचें कि आप पहले से निर्दिष्ट पते को ओवरलैप नहीं कर रहे हैं, और आप जाने के लिए अच्छे हैं।

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

+0

ठीक है, मैं मल्टीकास्ट डेटा स्वीकार करने का मतलब है। यह डेटा भेजने का मुद्दा नहीं है। –

10

मल्टीकास्ट प्रेषण उत्तर दिया गया है, रसीद बहुस्त्र्पीय समूह के लिए सदस्यता की आवश्यकता है।

यह (अभी भी) अनियंत्रित प्रतीत होता है, लेकिन पहले erlang-query मेलिंग सूची पर कवर किया गया है। 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 एक स्थानीय इंटरफेस है। (कोड की सौजन्य)

उपरोक्त उपयोग किए गए वही विकल्प inet:setopts को {drop_membership, {Addr, LAddr}} समेत समूह को सुनने से रोकने के लिए पास किए जा सकते हैं।

+0

प्रोप के लिए धन्यवाद^_^ – mog

4

मैं इस पीसी को अपने पीसी पर चलाने की कोशिश करता हूं। क्या हो सकता है, अगर मुझे हमेशा सॉकेट प्राप्त करके संदेश {त्रुटि, 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]), 

% -> {त्रुटि, eaddrnotavail}

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

मुझे विंडोज़ पर यह समस्या है, लेकिन वास्तव में वही कोड लिनक्स पर पूरी तरह से काम करता है –