2008-09-17 34 views
16

Làm thế nào để bạn sử dụng gen_udp trong Erlang để làm phát đa hướng? Tôi biết nó trong mã, không có tài liệu nào đằng sau nó. Gửi dữ liệu là hiển nhiên và đơn giản. Tôi đã tự hỏi làm thế nào để thêm thành viên. Không chỉ thêm tư cách thành viên khi khởi nghiệp mà còn thêm thành viên khi đang chạy cũng sẽ hữu ích.Erlang Multicast

Trả lời

14

Dưới đây là ví dụ về cách nghe lưu lượng truy cập 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. 
0

Multicast được xác định bởi địa chỉ IP

Đó là giống nhau ở erlang như đối với mọi ngôn ngữ. Địa chỉ IP 224.0.0.0 đến 239.255.255.255 là địa chỉ multicast.

Chọn một địa chỉ trong phạm vi đó, kiểm tra xem bạn có đang chồng chéo địa chỉ đã được chỉ định hay không và bạn có thể thực hiện tốt.

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

+0

Vâng, tôi có nghĩa là chấp nhận dữ liệu đa hướng. Nó không phải là vấn đề gửi dữ liệu. –

10

Gửi đa phương tiện đã được trả lời, biên lai yêu cầu đăng ký nhóm phát đa hướng.

Nó (vẫn) dường như không có giấy tờ, nhưng đã được đề cập đến trong danh sách gửi thư câu hỏi trước tiên. 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}}]). 

nơi Addr là nhóm multicast, và LAddr là một giao diện địa phương. (mã lịch sự của mog)

Các tùy chọn tương tự được sử dụng ở trên có thể được chuyển đến inet:setopts bao gồm {drop_membership, {Addr, LAddr}} để ngừng nghe nhóm.

+0

cảm ơn các đạo cụ^_^ – mog

4

Tôi cố gắng lấy ví dụ này đang chạy trên PC của mình. Điều gì có thể xảy ra, nếu tôi nhận được thông báo {error, eaddrnotavail} bằng cách mở ổ cắm nhận?

Ví dụ 1: Đây hoạt động:

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

Ví dụ 2: Bắt một lỗi runtime:

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

% -> {lỗi, 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

Tôi có vấn đề này trên Windows, nhưng chính xác cùng một mã hoạt động hoàn hảo trên Linux –