1

当我尝试做以下事情时

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

4

1 回答 1

2

你做错了什么。当套接字不是活动套接字时,您的 5 个进程必须gen_udp:recv/2,3在这种情况下显式调用自己,但我不完全确定这会起作用。我想你会得到{error, not_owner}回报。

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

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

于 2013-01-03T12:51:52.897 回答