2013-03-13 5 views
2

연결을 허용하고 간단한 방식으로 응답해야하는 SSL 서버 애플리케이션을 개발 중입니다. 얼랭 (Erlang) 셸에서 테스트 된 일반적인 얼랭 (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 파일이 위치하고 Erlang 셸을 실행하는 ebin 폴더에 넣습니다. 나는 다음과 같은 오류가 발생

redirector_app:start([],[]). 

: 내가 가진 동일한 폴더와 같은 쉘에서 보강 철근 응용 프로그램을 실행하려고 할 때, 그러나

api: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}]}]} 

이 내가 철근 응용 프로그램의 루트로 이동하는 경우 변경으로 얼랑 쉘을 실행하지 않습니다

$ erl -pa ebin/ 

문제를 연결 문제로 좁혔습니다. 나는 ssl : transport_accept (LSocket)가 실행되기 전에 실제로 연결이 닫힌 것 같아요.

+0

당신의 redirector_app 난 당신이 기사를 읽을 것을 권장합니다 얼랑 http://www.erlang.org/doc/design_principles/release_structure.html

를 출시 사용하는 경우 당신은 당신이 당신의 응용 프로그램 전에 시작됩니다에 의존하는 모든 응용 프로그램이 자동으로 수행 할 수 있는지 확인해야합니다 :/2 기능을 시작해야 return {ok, pid()}. 이상적으로는 감독자를 거기서 시작하고 그 감독자에게서 다른 프로세스를 아이들로 시작해야합니다. 나는 이것이 당신의 문제를 어떻게 든 해결할 것이라고 생각하지 않습니다. cert 경로를 '../ priv/....'에서 'priv/...'로 변경하고 erl -pa ebin으로 앱의 루트에서 실행 해보십시오. Dmitry가 나열한 링크를 읽었을 것입니다. .app 파일 (.app.src 및 rebar는 나머지를 처리합니다)에 종속성을 나열하고 앱을 시작하기 전에 (릴리스를 사용하지 않는 경우) 시작되었는지 확인해야합니다. – cashmere

+0

오, 응용 프로그램으로 응용 프로그램을 시작하십시오 : start (리디렉터) not redirector_app : start ([], []) – cashmere

답변

1

보강 철근은 보강 철근 자체입니다. 그리고 당신이하는 일은 Erlang 어플리케이션입니다. 여기에서 설명서를 확인할 수 있습니다. http://www.erlang.org/doc/design_principles/applications.html

Erlang 응용 프로그램이 다르게 시작됩니다. application:start(redirector)을 사용해야합니다. 또한 ebin (또는 다른 검색 경로)에 redirector.app 개의 파일이 있어야하며이 파일은 {mod, {redirector_app,[]}}이어야합니다. 당신이 http://www.metabrew.com/article/erlang-rebar-tutorial-generating-releases-upgrades