2011-07-11 7 views
0
 
{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. 

私はスケーラビUDPサーバーを作成します。 ErlangのUDPメカニズムは、一度に1回は単純でした。 もう、別の方法はありませんか?ErlangでオーバーラップUDPをサポートしないのはなぜですか?

+1

を閉じていますか? – MartinStettner

+1

質問がありますか?フォーマット? – keymone

答えて

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は、いつでも最初にソケットからデータを読み取っていることを意味します。この場合

通常の問題は、次のとおりです。

  • 制御プロセスが死んだので、ソケットは申し訳ありませんが、再度、質問何だった