为什么不在Erlang中支持重叠UDP?

时间:2011-07-11 10:26:39

标签: erlang udp

{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机制一次只做一次。 曾经,没有别的办法吗?

1 个答案:

答案 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套接字,Pid0Pid1通过生成的套接字。请注意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.

这只是传入数据包的简单循环。这意味着Pid0Pid1是从套接字读取数据的,无论何时第一次。

这种情况下的常见问题是:

  • 控制过程死亡,因此插座关闭