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

あなたは何か間違ったことをしました。ソケットがアクティブなソケットではない場合、gen_udp:recv/2,3このシナリオでは 5 つのプロセスが明示的に自分自身を呼び出す必要がありますが、それが機能するかどうかは完全にはわかりません。後押ししてくれると思います{error, not_owner}

機能する別のアプローチは、元のプロセスでパケットを取得し、通常のメッセージとして一度に 1 つずつワーカーに転送することです。これは機能しますが、コードを少し変更する必要があります。

背景情報については、所有者または制御プロセスの概念を参照してください。各ポート/ソケットには 1 つあり、所有者がクラッシュすると、ソケットも閉じられます。

于 2013-01-03T12:51:52.897 に答える