defmodule SNet.TCPServer do require Logger use Task, restart: :permanent def start_link(_) do Task.start_link(__MODULE__, :accept, []) end @doc """ Starts accepting connections on the given `port`. """ def accept() do port = Application.get_env(:shard, :port) {:ok, socket} = :gen_tcp.listen(port, [:binary, packet: 2, active: false, reuseaddr: true]) Logger.info "Accepting connections on port #{port}" loop_acceptor(socket, port) end defp loop_acceptor(socket, my_port) do {:ok, client} = :gen_tcp.accept(socket) {:ok, pid} = DynamicSupervisor.start_child(Shard.DynamicSupervisor, {SNet.TCPConn, %{socket: client, my_port: my_port, is_client: false}}) :ok = :gen_tcp.controlling_process(client, pid) loop_acceptor(socket, my_port) end end