如何从Erlang中不同线程的同一UDP端口接收数据?

时间:2013-01-03 11:08:29

标签: 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中是不可能的?

1 个答案:

答案 0 :(得分:2)

你做错了什么。当套接字不是活动套接字时,您的5个进程必须在此方案中自己显式调用gen_udp:recv/2,3,但我不完全确定它是否有效。我猜你会得到一个{error, not_owner}

另一种可行的方法是让原始进程获取数据包,然后将它们作为正常消息一次转发给您的工作者。这将有效,但您需要稍微更改一下代码。

有关背景信息,请查看所有者或控制过程的概念。每个端口/套接字都有一个,如果所有者崩溃,套接字也会关闭。