diff options
author | kballou <kballou@devnulllabs.io> | 2016-03-19 01:24:29 -0600 |
---|---|---|
committer | kballou <kballou@devnulllabs.io> | 2016-03-19 01:40:04 -0600 |
commit | e48f0a9ea5e9cff2b655aebefe642489f619d316 (patch) | |
tree | 6b3c4d21e377e59c1e16f866ba913275361e7514 /src/code/2/echo_server/lib/echo_server/echo.ex | |
parent | 83f89e9228ba97f3121344dbd72f4870c3112e8a (diff) | |
download | func-w-elixir-e48f0a9ea5e9cff2b655aebefe642489f619d316.tar.gz func-w-elixir-e48f0a9ea5e9cff2b655aebefe642489f619d316.tar.xz |
Add EchoServer example
Diffstat (limited to 'src/code/2/echo_server/lib/echo_server/echo.ex')
-rw-r--r-- | src/code/2/echo_server/lib/echo_server/echo.ex | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/code/2/echo_server/lib/echo_server/echo.ex b/src/code/2/echo_server/lib/echo_server/echo.ex new file mode 100644 index 0000000..3a96f29 --- /dev/null +++ b/src/code/2/echo_server/lib/echo_server/echo.ex @@ -0,0 +1,36 @@ +defmodule EchoServer.Echo do + + def accept(port) do + {:ok, socket} = :gen_tcp.listen( + port, + [:binary, packet: :line, active: false, reuseaddr: true]) + loop_acceptor(socket) + end + + defp loop_acceptor(socket) do + {:ok, client} = :gen_tcp.accept(socket) + {:ok, pid} = Task.Supervisor.start_child( + EchoServer.TaskSupervisor, fn -> serve(client) end) + :ok = :gen_tcp.controlling_process(client, pid) + loop_acceptor(socket) + end + + defp serve(socket) do + socket + |> read_line + |> (fn(x) -> "> " <> x end).() + |> write_line(socket) + + serve(socket) + end + + defp read_line(socket) do + {:ok, data} = :gen_tcp.recv(socket, 0) + data + end + + defp write_line(line, socket) do + :gen_tcp.send(socket, line) + end + +end |