本次主要探讨esockd项目
接上一篇:
%% Start MQTT/TCP listener
-spec(start_listener(esockd:proto(), esockd:listen_on(), [esockd:option()])
-> {ok, pid()} | {error, term()}).
start_listener(tcp, ListenOn, Options) ->
start_mqtt_listener('mqtt:tcp', ListenOn, Options);
%% Start MQTT/TLS listener
start_listener(Proto, ListenOn, Options) when Proto == ssl; Proto == tls ->
start_mqtt_listener('mqtt:ssl', ListenOn, Options);
start_mqtt_listener(Name, ListenOn, Options) ->
SockOpts = esockd:parse_opt(Options),
esockd:open(Name, ListenOn, merge_default(SockOpts),
{emqx_connection, start_link, [Options -- SockOpts]}).
可以看到,这里使用了两个esockd函数:
- esockd:parse_opt/1
- esockd:open/3
简单看一下目录结构,发现是一个相对标准的socket server开发,listener+accepter;看一下rebar.config,并没有引用其他库,是一个使用erlang底层自行实现的基本应用。
esockd_app.erl:
启动主监控树进程
esockd_sup.erl:
启动esockd_limiter:看起来是一个用户级别的限制,桶、Token、计时器
启动esockd_server:一个计数器的gen_server进程
提供的接口有:启动、停止、重启Listener
esockd.erl:
应用的主要API入口了,直接看open方法:
- 根据传入的协议名称,启动相应的listener,例如传入:'mqtt:tcp'
- 通过esockd_listener_sup, 启动:
a. esockd_connection_sup
b. esockd_accepter_sup
c. esockd_listener:
a)esockd_transport:listen 启动监听端口Lsock
b)根据配置AcceptNum,启动多个Accepter
d. esockd_accepter
收到客户端连接请求,握手成功后,调用conn_sup,启动conn
e. esockd_connection
判断连接数是否超过上限
回调M:F(A),创建connection
返回开篇,看到MFA是:{emqx_connection, start_link, [Options -- SockOpts]},这里刚好对接回主项目emqx。
网友评论