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
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.
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.
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.
cảm ơn các đạo cụ^_^ – mog
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}).
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 –
- 1. Multicast bằng Python
- 2. Multicast vs Broadcast trong LAN
- 3. Ức chế PostSharp Multicast với thuộc tính
- 4. Làm mới thành viên nhóm multicast
- 5. Multicast - không có thiết bị như vậy
- 6. Nhận người gửi ip từ gói multicast
- 7. MSMQ - Không thể nhận được từ hàng đợi Multicast
- 8. Java Multicast Time To Live luôn là 0
- 9. Java Multicast Gửi dữ liệu, không nhận được
- 10. boost :: asio :: ip :: multicast :: join_group không hoạt động
- 11. Biên dịch Erlang - Erlang là độc lập thực thi
- 12. Erlang và số lớn
- 13. erlang call stack
- 14. Dừng Erlang Daemon
- 15. erlang BEAM bytecode
- 16. Profiler/Analyzer cho Erlang?
- 17. Erlang File Append mode
- 18. Xách tay erlang
- 19. Erlang Scripting Language Interpreter
- 20. S combinator in Erlang
- 21. ActiveRecord cho Erlang
- 22. Phạm vi ở Erlang
- 23. Erlang Edoc in Emacs
- 24. Erlang emakefile giải thích
- 25. Backtracking in Erlang
- 26. chính xác trong Erlang
- 27. Currying Functions Erlang
- 28. binaries Matching trong Erlang
- 29. Erlang: Mnesia hoặc Mysql?
- 30. Vòng tin nhắn Erlang
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. –