2013-03-31 50 views
0

我有的像这样创建服务器:二郎产卵主管与参数

gateway.erl(监事监事) - > gateway_sup.erl(gen_servers监事) - > gateway_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]). 

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, []). 

的START_LINK()上gateway_sup.erl函数永远不会被调用。 如果网关是one_for_one,我不想传递一个参数,一切正常,但我只听一个硬编码端口。

我看不出为什么它不会调用gateway_sup:start_link/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])))