إرلانج البث المتعدد
-
09-06-2019 - |
سؤال
كيف يمكنك استخدام 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 هي عناوين بث متعدد.
اختر عنوانًا في هذا النطاق، وتأكد من عدم تداخل عنوان معين بالفعل، وستكون جاهزًا للبدء.