我正在開發一個SSL服務器應用程序,該應用程序應該可以接受連接並以簡單的方式進行響應。我已經在Erlang shell中測試過的常規Erlang腳本中創建了應用程序的框架。這種方法完美無瑕,但是當試圖在Rebar中實現時,模塊停止工作。Erlang SSL模塊無法通過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).
我的鋼筋應用的實現看起來如下(稱爲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.
我可以去啓動API模塊到.beam文件所在的ebin文件夾並運行Erlang shell。在Erlang shell的我運行命令:
api:start().
然而,當我嘗試從同一個文件夾和相同的外殼用鋼筋應用:
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}]}]}
,如果我去了鋼筋應用的根本不會改變,與運行Erlang的外殼:
$ erl -pa ebin/
我已將問題縮小到連接問題。我認爲連接實際上在ssl:transport_accept(LSocket)運行之前關閉。
您redirector_app說,你依靠你的應用程序之前啓動的所有應用程序,這可自動完成:開始/ 2函數應該返回{ok,pid()}。理想情況下,您應該在那裏啓動一名主管,並從該主管開始其他流程作爲孩子。無論如何,我認爲這不會解決你的問題。嘗試將您的證書路徑從'../ priv/....'更改爲'priv/...',並使用erl -pa ebin從應用程序的根目錄運行。我會閱讀德米特里列出的鏈接。你應該在你的.app文件中列出你的依賴關係(.app.src和rebar會負責休息),並確保它們在你的應用程序啓動之前啓動(如果你沒有使用發行版)。 – cashmere 2013-03-14 14:40:31
哦,並通過應用程序啓動你的應用程序:啓動(重定向器)不redirector_app:開始([],[]) – cashmere 2013-03-14 14:46:20