2013-03-13 37 views
2

我正在開發一個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)運行之前關閉。

+0

您redirector_app說,你依靠你的應用程序之前啓動的所有應用程序,這可自動完成:開始/ 2函數應該返回{ok,pid()}。理想情況下,您應該在那裏啓動一名主管,並從該主管開始其他流程作爲孩子。無論如何,我認爲這不會解決你的問題。嘗試將您的證書路徑從'../ priv/....'更改爲'priv/...',並使用erl -pa ebin從應用程序的根目錄運行。我會閱讀德米特里列出的鏈接。你應該在你的.app文件中列出你的依賴關係(.app.src和rebar會負責休息),並確保它們在你的應用程序啓動之前啓動(如果你沒有使用發行版)。 – cashmere 2013-03-14 14:40:31

+0

哦,並通過應用程序啓動你的應用程序:啓動(重定向器)不redirector_app:開始([],[]) – cashmere 2013-03-14 14:46:20

回答

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

相關問題