上一篇文章大概捋了一下游戏服务器启动的时候对应模块的动作,现在我们来仔细研究一下其中的start_tcp/0和start_client/0部分。
在start_tcp/0中启动了sd_tcp_listener_sup监控树,并挂到sd_sup下。其后启动的进程树形关系如下:
这是游戏服务器启动后使用observer观察到的游戏内进程关系图,<0.68.0>为start_tcp/0启动的sd_tcp_listener_sup监控树,<0.70.0>为启动的sd_tcp_listener进程。跟随在sd_tcp_acceptor_sup后的十个进程为sd_tcp_acceptor进程。下面结合代码详细解释一下tcp连接的建立过程。
sd_tcp_listener:挂在sd_tcp_listener_sup监控树下的gen_server,用于监听tcp端口。看下它的初始化函数init/1:
init({AcceptorCount, Port}) ->
process_flag(trap_exit, true),
case gen_tcp:listen(Port, ?TCP_OPTIONS) of
{ok, LSock} ->
lists:foreach(fun (_) ->
{ok, _APid} = supervisor:start_child(
sd_tcp_acceptor_sup, [LSock])
end,
lists:duplicate(AcceptorCount, dummy)),
{ok, LSock};
{error,