0

次のように作成されたサーバーがあります。

gateway.erl (スーパーバイザーのスーパーバイザー) -> gateway_sup.erl (gen_servers のスーパーバイザー) -> gateway_serv.erl (すべてのクライアントが処理される場所)。

インターネットで見たように、これはかなり基本的なもので、ほとんどの人がこのようにやっています.

リッスン ソケットは、gateway_sup.erl で作成されます。クライアント ポートの制限がある場合に備えて、複数のソケットでリッスンしたいと考えています。

これまでのコードは次のとおりです。

ゲートウェイ.erl

-export([start_link/0, init/1, startWithPort/1]). 

start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

init([]) ->
    spawn_link(?MODULE, startWithPort, [8080]),
    spawn_link(?MODULE, startWithPort, [443]),
    {ok, {{simple_one_for_one, 3600, 3600},
         [{socket,
          {gateway_sup, start_link, []},
          permanent, 1000, supervisor, [gateway_sup]}
         ]}}.

startWithPort(Port) ->
    io:fwrite("Starting...: ~p~n", [Port]),
    supervisor:start_child(?MODULE, [Port]).

gateway_sup.erl

-export([start_socket/0, init/1, start_link/1]).

    start_link(Port) ->
        io:fwrite("gateway_sup start_link Port: ~p // ~p~n", [list_to_atom(atom_to_list(?MODULE) ++ atom_to_list(Port)), Port])
        supervisor:start_link({local, list_to_atom(atom_to_list(?MODULE) ++ atom_to_list(Port))}, ?MODULE, [Port]).

    init([Port]) ->
        io:fwrite("gateway_sup Init with port: ~p~n", [Port]),
        R = ssl:listen(Port, ?SSL_OPTIONS),
        {ok, LSocket} = R,
        spawn_link(fun empty_listeners/0),
        {ok, {{simple_one_for_one, 3600, 3600},
             [{socket,
               {gateway_serv, start_link, [LSocket]},
               temporary, 1000, worker, [gateway_serv]}
             ]}}.

    empty_listeners() ->
        [start_socket() || _ <- lists:seq(1,128)],
        ok.

    start_socket() ->
        supervisor:start_child(?MODULE, []).

gateway_sup.erl の start_link() 関数は呼び出されません。ゲートウェイが one_for_one で、パラメーターを渡そうとしない場合、すべて正常に動作しますが、ハードコードされた 1 つのポートのみをリッスンします。

gateway_sup:start_link/1 を呼び出さない理由がわかりませんか?

4

1 に答える 1

0

よし、見つけた!そんな些細なミスで一晩かかった!

エラーは、start_link 内でロールを作成しているときです。

list_to_atom(atom_to_list(?MODULE) ++ atom_to_list(Port))

に置き換えられました

list_to_atom(atom_to_list(?MODULE) ++ lists:flatten(io_lib:format("~B", [Port])))
于 2013-03-31T15:19:38.877 に答える