{ok,Socket} = gen_udp:open(9000, [binary,{active,false}, {reuseaddr,true}]), Pid0 = spawn_link( fun() -> loop_passive( Socket ) end ), Pid1 = spawn_link( fun() -> loop_passive( Socket ) end ) --> error .. (many overlapped receiving per a binded socket) N loop_passive(Socket) -> case gen_udp:recv(Socket, 0) of {ok, {Addr,Port,Packet}} -> process(Socket,Addr,Port,Packet), loop_passive(Socket); Error -> io:format("udp_passive error: ~p~n", [Error]) end.
我将制作scalabe UDP服务器。 Erlang UDP机制一次只做一次。 曾经,没有别的办法吗?
答案 0 :(得分:4)
让我们看一下可读的代码:
{ok,Socket} = gen_udp:open(9000, [binary,{active,false}, {reuseaddr,true}]),
Pid0 = spawn_link( fun() ->
loop_passive( Socket ) end ),
Pid1 = spawn_link( fun() ->
loop_passive( Socket ) end ).
这意味着self()
打开UDP套接字,Pid0
和Pid1
通过生成的套接字。请注意self()
(运行上述代码的过程)是套接字的控制过程。
loop_passive(Socket) ->
case gen_udp:recv(Socket, 0) of
{ok, {Addr,Port,Packet}} ->
process(Socket,Addr,Port,Packet),
loop_passive(Socket);
Error -> io:format("udp_passive error: ~p~n", [Error])
end.
这只是传入数据包的简单循环。这意味着Pid0
和Pid1
是从套接字读取数据的,无论何时第一次。
这种情况下的常见问题是: