From 9bae951c555f9c25876968fa98853253b7007a0f Mon Sep 17 00:00:00 2001 From: kballou Date: Fri, 24 Nov 2017 10:16:06 -0700 Subject: Level up the Echo Server This should enable the upgrade process to retain connections - Replace our simple task supervisor with a custom `simple_one_for_one` supervisor - Upgrade the echo server to use a `GenServer` behaviour --- lib/octonetcat/servers/echo.ex | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'lib/octonetcat/servers/echo.ex') diff --git a/lib/octonetcat/servers/echo.ex b/lib/octonetcat/servers/echo.ex index e416d9d..8ad6aff 100644 --- a/lib/octonetcat/servers/echo.ex +++ b/lib/octonetcat/servers/echo.ex @@ -6,23 +6,27 @@ defmodule Octonetcat.Echo do dies on failure or disconnect. """ + use GenServer require Logger - def serve(socket) do - socket - |> read_line() - |> write_line!(socket) + def start_link(socket) do + GenServer.start_link(__MODULE__, socket) + end - serve(socket) + def init(socket) do + :ok = :inet.setopts(socket, active: true) + {:ok, %{socket: socket}} + end + + def handle_info({:tcp, _, msg}, state = %{socket: socket}) do + msg + |> write_line!(socket) + {:noreply, state} end - def read_line(socket) do - case :gen_tcp.recv(socket, 0) do - {:ok, line} -> line - {:error, reason} -> - Logger.error(reason) - Process.exit(self(), :normal) - end + def handle_info({:tcp_closed, _}, _state) do + Logger.info("#{__MODULE__}: Connection closing...") + {:stop, :normal, %{}} end def write_line!(line, socket) do -- cgit v1.2.1