active_echo_protocol.erl 635 B

12345678910111213141516171819202122232425
  1. -module(active_echo_protocol).
  2. -export([start_link/4]).
  3. -export([init/4]).
  4. start_link(ListenerPid, Socket, Transport, Opts) ->
  5. Pid = spawn_link(?MODULE, init, [ListenerPid, Socket, Transport, Opts]),
  6. {ok, Pid}.
  7. init(ListenerPid, Socket, Transport, _Opts = []) ->
  8. ok = ranch:accept_ack(ListenerPid),
  9. loop(Socket, Transport).
  10. loop(Socket, Transport) ->
  11. {OK, Closed, Error} = Transport:messages(),
  12. Transport:setopts(Socket, [{active, once}]),
  13. receive
  14. {OK, Socket, Data} ->
  15. Transport:send(Socket, Data),
  16. loop(Socket, Transport);
  17. {Closed, Socket} ->
  18. ok;
  19. {Error, Socket, _} ->
  20. ok = Transport:close(Socket)
  21. end.