erlang: получить ответ от ssl - PullRequest
1 голос
/ 28 января 2020

Я добавил новый модуль (-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}.

1 Ответ

0 голосов
/ 17 февраля 2020

Мне удалось решить эту проблему с помощью модуля gen_server, поскольку он имеет явные обратные вызовы для любых сообщений.

...