سؤال

كيف يمكنك استخدام gen_udp في Erlang للقيام بالبث المتعدد؟أعلم أنه موجود في الكود، ولا يوجد أي توثيق خلفه.إرسال البيانات أمر واضح وبسيط.كنت أتساءل عن كيفية إضافة العضوية.ليس فقط إضافة العضويات عند بدء التشغيل، ولكن إضافة العضويات أثناء التشغيل سيكون مفيدًا أيضًا.

هل كانت مفيدة؟

المحلول

إليك مثال على التعليمات البرمجية حول كيفية الاستماع إلى حركة مرور 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. 

نصائح أخرى

تم الرد على إرسال البث المتعدد، ويتطلب الاستلام الاشتراك في مجموعة البث المتعدد.

يبدو (لا يزال) غير موثق، ولكن تمت تغطيته في القائمة البريدية لأسئلة erlang من قبل. 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}} للتوقف عن الاستماع إلى المجموعة.

أحاول تشغيل هذا المثال على جهاز الكمبيوتر الخاص بي.ماذا يمكن أن يحدث إذا تلقيت دائمًا الرسالة {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]),

% --> {خطأ، eaddrnotavail}

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

يتم تحديد البث المتعدد بواسطة عنوان IP

إنه نفس الشيء في إرلانج كما هو الحال في جميع اللغات.عناوين IP من 224.0.0.0 إلى 239.255.255.255 هي عناوين بث متعدد.

اختر عنوانًا في هذا النطاق، وتأكد من عدم تداخل عنوان معين بالفعل، وستكون جاهزًا للبدء.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top