首页 文章

与独立运行时相比,Erlang SSL模块无法通过Rebar应用程序运行

提问于
浏览
2

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

1 回答

相关问题