Привет, разбираюсь с ranch, пробую создать свой обработчик, реализующий gen_server. Что-то явно делаю не так - не происходит подтверждение подключения клиента к сокету.
В примере обработчик выглядит так:
start_link(ListenerPid, Socket, Transport, Opts) ->
Pid = spawn_link(?MODULE, init, [ListenerPid, Socket, Transport, Opts]),
{ok, Pid}.
init(ListenerPid, Socket, Transport, _Opts = []) ->
ok = ranch:accept_ack(ListenerPid),
io:format("ack~n"),
loop(Socket, Transport).
loop(Socket, Transport) ->
case Transport:recv(Socket, 0, infinity) of
{ok, Data} ->
Transport:send(Socket, Data),
loop(Socket, Transport);
_ ->
ok = Transport:close(Socket)
end.
Я создаю аналогичный модуль:
-record(state, {socket, transport}).
-define(SERVER, ?MODULE).
start_link(ListenerPid, Socket, Transport, Opts) ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [ListenerPid, Socket, Transport, Opts], []).
init([ListenerPid, Socket, Transport, _Opts = []]) ->
io:format("initializing handler...~n"),
ok = ranch:accept_ack(ListenerPid), %% процесс находится в бесконечном ожидании
io:format("ack~n"),
{ok, #state{socket = Socket, transport = Transport}, 0}.
handle_info(timeout, #state{socket = Socket, transport = Transport} = State) ->
io:format("timeout~n"),
case Transport:recv(Socket, 0, infinity) of
{ok, Data} ->
Transport:send(Socket, Data),
{noreply, State};
_ ->
ok = Transport:close(Socket),
{stop, normal, State}
end.
(лишнее убрал)
Функция ranch:accept_ack выглядит вот так:
accept_ack(ListenerPid) ->
receive {shoot, ListenerPid} -> ok end.
Собственно, не могу понять, почему процесс ranch не получает это сообщение и не дает мне работать (это из-за разделения на контейнер и модуль колбэка gen_server?)