aboutsummaryrefslogtreecommitdiff
path: root/shard/lib/net/tcpserver.ex
blob: 1aa5738b0ac668a7e7562cb46a00c4a670ac12c5 (plain) (blame)
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
defmodule SNet.TCPServer do
  require Logger
  use Task, restart: :permanent

  def start_link(port) do
    Task.start_link(__MODULE__, :accept, [port])
  end

  @doc """
  Starts accepting connections on the given `port`.
  """
  def accept(port) do
    {: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