연결을 허용하고 간단한 방식으로 응답해야하는 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)가 실행되기 전에 실제로 연결이 닫힌 것 같아요.
당신의 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
오, 응용 프로그램으로 응용 프로그램을 시작하십시오 : start (리디렉터) not redirector_app : start ([], []) – cashmere