我有一个像这样创建的服务器:
gateway.erl(主管的主管) - > gateway_sup.erl(gen_servers的主管) - > gateway_serv.erl(处理每个客户端的地方)。
这是非常基本的,因为我在互联网上看到,大多数人都是这样做的。
Listen Socket是在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]).
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并且我没有尝试传递参数,那么一切正常,但我只会听一个硬编码端口。
我看不出为什么它不会调用gateway_sup:start_link / 1?
答案 0 :(得分: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])))