【问题标题】:Erlang SSL module not functional through Rebar app compared to when run standalone与独立运行相比,Erlang SSL 模块无法通过 Rebar 应用程序运行
【发布时间】:2013-03-02 00:21:01
【问题描述】:

我正在开发一个 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) 运行之前关闭。

【问题讨论】:

  • 你的 redirector_app:start/2 函数应该返回 {ok, pid()}。理想情况下,您应该在那里启动一个主管,并从该主管启动其他进程作为子进程。无论如何,我认为这不会解决您的问题。尝试将您的证书路径从 '../priv/....' 更改为 'priv/...' 并使用 erl -pa ebin 从应用程序的根目录运行。我会阅读 Dmitry 列出的链接。您应该在 .app 文件中列出您的依赖项(.app.src 和 rebar 将负责休息)并确保它们在您的应用程序启动之前启动(以防您未使用发行版)。
  • 哦,然后通过 application:start(redirector) 而不是 redirector_app:start([],[]) 启动您的应用程序

标签: ssl erlang rebar


【解决方案1】:

钢筋应用程序就是钢筋本身。你所做的就是所谓的 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

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2012-12-14
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    相关资源
    最近更新 更多