Managing multiple TCP Connections in active-mode from one GenServer

I generally use this pattern for interacting with a single TCP resource, in active-mode:

  def connect(ip, port) do
    t = System.system_time(1000)
    case :gen_tcp.connect(ip, port, [:binary, active: :once, keepalive: true, nodelay: true]) do
      {:ok, socket} ->
        log "Connected to #{ip}:#{port} in #{System.system_time(1000) - t}ms"
        socket
      {:error, err} ->
        log "Connect Error - #{ip}: #{port} [#{inspect err}]"
        Process.send_after(self(), :retry_connect, 3000)
        nil
    end
  end

  def handle_info({:tcp, _, data}, s) do
    s = proc_raw(s.extra <> data, %{s | extra: ""})

    :inet.setopts(s.socket, active: :once)

    {:noreply, s}
  end

How can this be extended to handle multiple TCP connections in the same GenServer?

So far this works great for a single socket in active-mode

2 Likes
handle_info({:tcp, socket, data}, s) do

  s = data_arrived_from_socket(socket, data, s)
  
  :init.setopts(socket, active: :once)

  {:noreply, s}
end
1 Like