Ich habe eine GenServer
, die Verbindung zu einer Remote-TCP-Verbindung über gen_tcp
.Wie kann ich ein TCP-Timeout auf einem aktiven Socket in Elixir mit gen_tcp erkennen?
opts = [:binary, active: true, packet: :line] {:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts}
Ich bin Umgang mit Nachrichten mit:
def handle_info({:tcp, socket, msg}, stage) do IO.inspect msg {:noreply, state} end
die großen Werke. Der TCP-Server ist jedoch anfällig für Zeitüberschreitungen. Wenn ich gen_tcp.recv
verwende, könnte ich eine Zeitüberschreitung angeben. Ich verwende jedoch active: true
, um Nachrichten mit handle_info
zu empfangen, und muss nicht übergehen und recv
aufrufen. So wartet die GenServer
glücklich auf die nächste Nachricht, auch wenn der Server abgelaufen ist.
Wie kann ich die GenServer
auslösen eine Funktion, wenn es nach X Sekunden keine Nachricht von der TCP-Verbindung erhalten hat? Bin ich mit recv
stecken geblieben?
Nicht sicher, warum jemand dies abgelehnt hat. Dies ist ein grundlegendes Rätsel, das viele Menschen schon früh mit Erlang, Elixir, LFE usw. bei Verwendung von '{active, true}' - Sockets konfrontieren - und die Lösung ist nicht nur auf Elixir anwendbar. – zxq9