2013-01-03 41 views
1

當我嘗試做以下事情如何從Erlang的不同線程中的相同UDP端口接收數據?

init() -> 
    case gen_udp:open(10000, [binary, {active, false}]) of 
     {ok, Socket} -> 
      startListen(5, Socket); 
    end. 

startListen(0, Socket) -> 
    Socket; 
startListen(N, Socket) -> 
    Pid = spawn_link(fun() -> listen(Socket) end), 
    startListen(N-1, Socket). 

listen(Socket)-> 
    receive 
     {udp, Socket, Host, Port, Data} -> 
      ... 
    end. 

這表明,它不能從任何線程接收。我做錯了什麼,或者事實上在erlang中是不可能的?

回答

2

你做錯了什麼。當套接字不是活動套接字時,您的5個進程必須在這種情況下自己明確地調用gen_udp:recv/2,3,但我並不完全確定這是可行的。我想你會得到一個{error, not_owner}回來。

另一種可行的方法是讓原始進程獲取數據包,然後將它們作爲正常消息逐個轉發給您的工作人員。這會起作用,但你需要改變你的代碼。

有關背景信息,請查看擁有者或控制過程的概念。每個端口/套接字都有一個,如果所有者崩潰,套接字也會關閉。

相關問題