2011-07-11 26 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. 

我會製作scalabe UDP服務器。一次只需要一次簡單的Erlang UDP機制。 有沒有別的辦法?爲什麼不支持在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是從套接字中讀取數據的時間,無論何時先行。

在這種情況下,通常的問題是:

  • 控制進程死亡,從而關閉套接字