Ich habe einen tcp_listener als gen_server() implementiert. Ich habe eine Funktion namens start_link (Port) erstellt einen tcp_listener an diesem Port. Jetzt habe ich Probleme zu verstehen, wie ich dem tcp_listener sagen kann, dass er aufhört, durch stop() zu hören. Ich habe versucht, eine Funktion wie diese mit Stop aufzurufen.Wie man einen tcp_listener stoppt, der in erlang als gen_server implementiert ist
in der terminate/2-Funktion Ich versuchte, die Abhörbuchse zu schließen, aber fehlgeschlagen.
terminate(_Reason, State = #state{lsocket = LSocket}) ->
gen_tcp:close(LSocket),
NewState = State#state{lsocket = null},
{ok, NewState}.
Wenn ich den abhörenden Socket schließe, was passiert mit den akzeptierten Verbindungen, die ich hervorbrachte.
Vielen Dank!
start_link(Port) when is_integer(Port) ->
State = #state{port = Port},
gen_server:start_link({local, ?MODULE}, ?MODULE, State, []).
init(State = #state{port = Port}) ->
io:format("Supervisor started me and I am listening at ~p ~n", [Port]),
case gen_tcp:listen(Port, ?TCP_OPTIONS) of
{ok, LSocket} ->
NewState = State#state{lsocket = LSocket},
spawn(fun() -> accept(NewState) end),
{ok, NewState};
{error, Reason} ->
{stop, Reason}
end.
accept(State = #state{lsocket = LSocket}) ->
case gen_tcp:accept(LSocket) of
{ok, Socket} ->
Pid = spawn(fun() ->
io:format("Connection accepted ~n"),
loop(Socket)
end),
gen_tcp:controlling_process(Socket, Pid),
accept(State);
{error, closed} -> error
end.
loop(Socket) ->
case gen_tcp:recv(Socket, 0) of
{ok, Data} ->
gen_tcp:send(Socket, Data),
loop(Socket);
{error, closed} ->
ok
end.
Sie spawnen keine Verbindung, nur einen Prozess. Wenn Sie den Socket schließen, werden alle Verbindungen gelöscht. Lachst du eigentlich irgendwelche Prozesse? – Amiramix
Ja, ich spawne tatsächlich Prozesse. Wenn ich eine Verbindung annehme, spawne ich einen neuen Prozess. Also später, wenn ich den hörenden Sockel schließe, kann ich mit den akzeptierten Sockeln arbeiten, während ich Nachrichten sende und empfange (in meinem Fall echo_server). Bitte beachten Sie den Code, der jetzt bearbeitet wird. – listen