aboutsummaryrefslogtreecommitdiff
path: root/lib/octonetcat/servers/echo.ex
blob: 16ba189f0547748f35c1279c4d5c7d3cb8e24849 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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.
  """

  use GenServer
  require Logger

  def start_link(socket) do
    GenServer.start_link(__MODULE__, socket)
  end

  def init(socket) do
    :ok = :inet.setopts(socket, active: true)
    {:ok, %{socket: socket}}
  end

  def handle_info({:tcp, _, msg}, state = %{socket: socket}) do
    msg
    |> String.trim()
    |> String.reverse()
    |> Kernel.<>("\n")
    |> write_line!(socket)
    {:noreply, state}
  end

  def handle_info({:tcp_closed, _}, _state) do
    Logger.info("#{__MODULE__}: Connection closing...")
    {:stop, :normal, %{}}
  end

  def write_line!(line, socket) do
    :gen_tcp.send(socket, line)
  end
 end