Thanks to Erlang and OTP this is so straightforward.
defmodule EchoTcp do def start(port) do {:ok, socket} = :gen_tcp.listen(port, [:binary, packet: :line, active: false, reuseaddr: true])
IO.puts("Echo server listening on port #{port}") accept_loop(socket) end
defp accept_loop(socket) do {:ok, client} = :gen_tcp.accept(socket) spawn(fn -> handle_client(client) end) accept_loop(socket) end
defp handle_client(socket) do case :gen_tcp.recv(socket, 0) do {:ok, data} -> :gen_tcp.send(socket, data) handle_client(socket)
{:error, :closed} -> IO.puts("Client disconnected")
{:error, reason} -> IO.puts("Error: #{inspect(reason)}") end endend