Я добавил новый модуль (-behavior(gen_mod)
) в ejabberd, и мне удалось открыть ssl-соединение с сервером и отправить сообщение напрямую, используя ssl-соединение (функция ssl:send()
). Однако после этого я не могу получить ответ.
- Я попытался использовать опцию
receive
в erlang для перехвата сообщений, но все равно не повезло. - Я попытался изменить модуль быть модулем с состоянием с использованием поведения
gen_server
, и я до сих пор не наблюдаю никаких вызовов handle_info
с каким-либо сообщением. - Я также не смог получить никакого ответа, используя
ssl:recv/2
.
Я что-то упустил? Как я могу асинхронно получить ответ от сокета ssl в erlang?
Любые указатели будут действительно оценены. Спасибо!
код: Добавление только соответствующих частей кода.
sendPacketToServer() ->
case ssl:connect(Gateway, Port, Options, ?SSL_TIMEOUT) of
{ok, Socket} ->
ssl:controlling_process(Socket, self()),
Packet = .....,
Result = ssl:send(Socket, Packet),
receiveMessage(),
ssl:close(Socket),
?INFO_MSG("~n~n~n~n Successfully sent payload to the server, result: ~p for the user: ~p", [Result, Username]);
{error, Reason} = Err ->
?ERROR_MSG("Unable to connect to the server: ~s for the user: ~p", [ssl:format_error(Reason), Username]),
Err
end
...
....
receiveMessage() ->
receive ->
{ssl, Msg, Data} -> % incoming msg from SSL, send it to process
......
{ssl_closed, Msg} -> % incoming msg from SSL, send it to process
.....
{ssl_error, Msg} -> % incoming msg from SSL, send it to process
.....
{ssl_passive, Msg} -> % incoming msg from SSL, send it to process
....
end.
Добавлен следующий код для gen_server: (при выполнении следующих действий я не закрываю сокет сразу, но все равно не работает).
start(Host, Opts) ->
gen_mod:start_child(?MODULE, Host, Opts).
stop(Host) ->
gen_mod:stop_child(?MODULE, Host).
init([ServerHost|_]) ->
Opts = gen_mod:get_module_opts(ServerHost, ?MODULE),
start(ServerHost, Opts),
{ok, #state{host = ServerHost}}.
handle_call(Request, From, State) ->
?WARNING_MSG("Unexpected call from ~p: ~p", [From, Request]),
{noreply, State}.
handle_cast(Msg, State) ->
?WARNING_MSG("Unexpected cast: ~p", [Msg]),
{noreply, State}.
handle_info(Info, State) ->
?WARNING_MSG("Unexpected info: ~p", [Info]),
{noreply, State}.
terminate(_Reason, State) ->
ok.
code_change(_OldVsn, State, _Extra) -> {ok, State}.