Erlang使用参数生成一个主管

Erlang使用参数生成一个主管,erlang,erlang-supervisor,Erlang,Erlang Supervisor,我有一个这样创建的服务器: gateway.erl(主管的主管)->gateway\u sup.erl(gen\u服务器的主管)->gateway\u serv.erl(处理每个客户端的地方) 正如我在互联网上看到的,这是非常基本的,大多数人都是这样做的 侦听套接字是在gateway_sup.erl上创建的,我希望通过多个套接字进行侦听,以防出现一些客户端端口限制 这是我到目前为止的代码 gateway.erl -export([start_link/0, init/1, startWithPo

我有一个这样创建的服务器:

gateway.erl(主管的主管)->gateway\u sup.erl(gen\u服务器的主管)->gateway\u serv.erl(处理每个客户端的地方)

正如我在互联网上看到的,这是非常基本的,大多数人都是这样做的

侦听套接字是在gateway_sup.erl上创建的,我希望通过多个套接字进行侦听,以防出现一些客户端端口限制

这是我到目前为止的代码

gateway.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]).
网关辅助设备

-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, []).
-导出([start\u socket/0,init/1,start\u link/1])。
启动链接(端口)->
io:fwrite(“网关支持启动链接端口:~p/~p~n”,[list_to_atom(atom_to_list(?模块)++atom_to_list(端口)),端口])
主管:启动链接({本地,列表到原子(原子到列表(?模块)+原子到列表(端口))),模块,[端口])。
初始化([端口])->
io:fwrite(“网关支持初始化,端口:~p~n,[port]),
R=ssl:侦听(端口、?ssl_选项),
{ok,LSocket}=R,
生成链接(有趣的空侦听器/0),
{好的,{简单的{u一{u一{u一},3600,3600},
[{套接字,
{网关服务,启动链接,[LSocket]},
临时,1000,工作人员,[网关服务]}
]}}.
空侦听器()->
[start_socket()| | |u
主管:启动子模块(?模块,[])。
从未调用gateway_sup.erl上的start_link()函数。 如果网关是一对一,并且我不想传递参数,那么一切正常,但我只通过一个硬编码端口进行侦听


我不明白为什么它不呼叫网关\u-sup:start\u-link/1?

好的,找到了!我花了一个多晚上才犯了这么小的错误

错误是当我在start\u链接中创建角色时

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])))