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