【发布时间】:2020-11-09 01:34:29
【问题描述】:
我有以下简单的 UDP 服务器:
-
只接受二进制 >,
-
否则会崩溃
-module(server). -export([listen/1]). listen(Port) -> spawn(fun()->run_it(Port) end). run_it(Port) -> {ok, Skt} = gen_udp:open(Port, [binary]), loop(Skt). loop(Skt) -> receive {udp, Skt, _, _, Bin} -> case Bin of <<0:32>> -> io:fwrite("~p~n", [{"Good Format: ", Bin}]), loop(Skt) end end.
现在,我的对等 UDP 客户端将故意发送格式错误的数据。
我可以编写一个 case 子句来匹配任何消息并忽略任何消息 格式错误的消息。
但是,如果最终出现错误,它对我没有帮助。
我在某处读过:“不要进行防御性编程,让它崩溃,然后修复它”。
=ERROR REPORT==== 19-Jul-2020::21:15:29.872000 ===
Error in process <0.93.0> with exit value:
{{case_clause,<<0>>},[{server,loop,1,[{file,"server.erl"},{line,16}]}]}
酷,它崩溃了,但我希望我的服务器现在自动重启 :-)
我读到一个名为“supervisor”的进程可以监控我的 服务器,并在检测到它死亡时重新启动它。
所以,我使用了“rebar3”,因为它在我编译时帮助了我很多 几个文件只有 1 行'rebar3 compile'。
它会自动创建一个包含 3 个文件的 /src/,但只有 2 个是 现在让我感兴趣:
- server_app.erl
- server_sup.erl
另外,我已经阅读了文档,但我仍然无法理解。
任何人都可以建议,或转换我的 19 行代码 server.erl 到 server_app.erl 并由 server_sup.erl 监督?
N.B:我不是在寻找 gen_server,我经常看到它,但我是 有义务也或仅将其转换为 gen_server 应用程序+主管可以满足我的要求吗?
提前致谢,
最好的问候,
【问题讨论】: