我正在开发一个 SSL 服务器应用程序,它应该接受连接并以简单的方式响应。我已经在常规的 Erlang 脚本中创建了应用程序的框架,该脚本已经在 Erlang shell 中进行了测试。这种方法完美无缺,但当尝试在 Rebar 中实现时,模块停止工作。
我的模块看起来像这样(称为 api):
-define(SSL_OPTIONS, [{active, false}, {reuseaddr, true}, {certfile,"../priv/certificate.pem"}, {keyfile,"../priv/key.pem"}]).
start() ->
try
ssl:start(),
Pid = listen(3000),
{ok, Pid}
catch
_:_ -> error
end.
listen(Port) ->
{ok, LSocket} = ssl:listen(Port, ?SSL_OPTIONS),
spawn(fun() -> accept(LSocket) end).
accept(LSocket) ->
{ok, Socket} = ssl:transport_accept(LSocket),
Pid = spawn(fun() -> communicator:loop(Socket) end),
ssl:controlling_process(Socket, Pid),
?MODULE:accept(LSocket).
我对 Rebar 应用程序的实现如下所示(称为 redirector_app):
-module(redirector_app).
-behaviour(application).
%% Application callbacks
-export([start/2, stop/1]).
%% ===================================================================
%% Application callbacks
%% ===================================================================
start(_StartType, _StartArgs) ->
redirector_sup:start_link(),
spawn(fun() -> init() end).
stop(_State) ->
ok.
init() ->
api:start(),
ok.
我可以通过进入 .beam 文件所在的 ebin 文件夹并运行 Erlang shell 来启动 api 模块。在 Erlang shell 中,我运行命令:
api:start().
但是,当我尝试从相同的文件夹和相同的 shell 运行 Rebar 应用程序时:
redirector_app:start([],[]).
我收到以下错误:
Error in process <0.50.0> with exit value: {{badmatch,{error,einval}},[{ssl,transport_accept,2,[{file,"ssl.erl"},{line,197}]},{api,accept,1,[{file,"src/api.erl"},{line,25}]}]}
如果我转到 Rebar 应用程序的根目录并运行 Erlang shell,这不会改变:
$ erl -pa ebin/
我已将问题缩小为连接问题。我认为连接实际上在 ssl:transport_accept(LSocket) 运行之前关闭。
最佳答案
钢筋应用就是钢筋本身。而你所做的就是所谓的 Erlang 应用程序。您可以在此处查看文档:http://www.erlang.org/doc/design_principles/applications.html
Erlang 应用程序的启动方式不同。您必须使用 application:start(redirector)
。这也意味着您的 ebin
(或其他搜索路径)中必须有 redirector.app
文件,该文件必须有 {mod, {redirector_app,[]}}
。您必须确保您依赖的所有应用程序都在您的应用程序之前启动,如果您使用 Erlang 版本,这可能会自动完成 http://www.erlang.org/doc/design_principles/release_structure.html
我推荐你看一篇文章http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades
关于ssl - 与独立运行时相比,Erlang SSL 模块无法通过 Rebar 应用程序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15395932/