From cc67e8e9c1de34bcb2f1f2b84d96aca253b2ae08 Mon Sep 17 00:00:00 2001 From: kballou Date: Fri, 24 Nov 2017 09:39:16 -0700 Subject: Add echo server Modify `acceptor` to pass over the connection to a task echo server. --- lib/octonetcat/accepter.ex | 9 +++++++-- lib/octonetcat/servers/echo.ex | 25 +++++++++++++++++++++++++ lib/octonetcat/supervisor.ex | 1 + 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 lib/octonetcat/servers/echo.ex (limited to 'lib') diff --git a/lib/octonetcat/accepter.ex b/lib/octonetcat/accepter.ex index c76d0af..a398676 100644 --- a/lib/octonetcat/accepter.ex +++ b/lib/octonetcat/accepter.ex @@ -17,8 +17,13 @@ defmodule Octonetcat.Accepter do defp loop_accepter(socket) do {:ok, client} = :gen_tcp.accept(socket) Logger.info("Accepted connection") - Logger.info("Closing connection") - :gen_tcp.close(client) + Logger.info("Passing to Echo Server") + {:ok, pid} = Task.Supervisor.start_child( + Octonetcat.TaskSupervisor, + Octonetcat.Echo, + :serve, + [client]) + :ok = :gen_tcp.controlling_process(client, pid) loop_accepter(socket) end diff --git a/lib/octonetcat/servers/echo.ex b/lib/octonetcat/servers/echo.ex new file mode 100644 index 0000000..0d7487f --- /dev/null +++ b/lib/octonetcat/servers/echo.ex @@ -0,0 +1,25 @@ +defmodule Octonetcat.Echo do + @moduledoc """ + Echo TCP Socket Server + + Started under a task supervisor, lives for the life of the socket, + dies on failure or disconnect. + """ + + def serve(socket) do + socket + |> read_line!() + |> write_line!(socket) + + serve(socket) + end + + def read_line!(socket) do + {:ok, line} = :gen_tcp.recv(socket, 0) + line + end + + def write_line!(line, socket) do + :gen_tcp.send(socket, line) + end + end diff --git a/lib/octonetcat/supervisor.ex b/lib/octonetcat/supervisor.ex index 01029cd..50a5f66 100644 --- a/lib/octonetcat/supervisor.ex +++ b/lib/octonetcat/supervisor.ex @@ -11,6 +11,7 @@ defmodule Octonetcat.Supervisor do def init(_) do children = [ + supervisor(Task.Supervisor, [[name: Octonetcat.TaskSupervisor]]), worker(Task, [Octonetcat.Accepter, :accept, []]) ] -- cgit v1.2.1