当我尝试做以下事情时
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中是不可能的?
答案 0 :(得分:2)
你做错了什么。当套接字不是活动套接字时,您的5个进程必须在此方案中自己显式调用gen_udp:recv/2,3
,但我不完全确定它是否有效。我猜你会得到一个{error, not_owner}
。
另一种可行的方法是让原始进程获取数据包,然后将它们作为正常消息一次转发给您的工作者。这将有效,但您需要稍微更改一下代码。
有关背景信息,请查看所有者或控制过程的概念。每个端口/套接字都有一个,如果所有者崩溃,套接字也会关闭。