defmodule CA.TSP do @moduledoc "CA/TSP TCP server." require CA def code(), do: :binary.encode_hex(:crypto.strong_rand_bytes(8)) def start_link(port: port), do: {:ok, :erlang.spawn_link(fn -> listen(port) end)} def child_spec(opt) do %{ id: TSP, start: {CA.TSP, :start_link, [opt]}, type: :supervisor, restart: :permanent, shutdown: 500 } end def listen(port) do {:ok, socket} = :gen_tcp.listen( port, [:binary, {:packet, 0}, {:active, false}, {:reuseaddr, true}] ) accept(socket) end def accept(socket) do {:ok, fd} = :gen_tcp.accept(socket) :erlang.spawn(fn -> __MODULE__.loop(fd) end) accept(socket) end def message(_socket, cms) do :logger.info(~c"Unknown message request ~p", [cms]) end def answer(socket, res) do :gen_tcp.send(socket, res) end def loop(socket) do case :gen_tcp.recv(socket, 0) do {:ok, data} -> {:ok, dec} = :KEP.decode(:TimeStampReq, data) :io.format(~c"TimeStampReq:~n~p~n", [dec]) __MODULE__.message(socket, dec) __MODULE__.loop(socket) {:error, _} -> :exit end end end