Erlang поймать отключить клиент - PullRequest
0 голосов
/ 04 мая 2011

У меня есть tcp сервер, написанный на erlang и обработчик команд.Если клиент подключается к моему серверу, а затем закрывается, как я могу поймать разрыв сети?

Ответы [ 2 ]

8 голосов
/ 04 мая 2011

Я предполагаю, что вы используете vanilla gen_tcp для реализации вашего сервера.В этом случае процесс-акцептор (процесс, которому вы передаете Socket) получит сообщение {tcp_closed, Socket}, когда сокет закрыт со стороны клиента.

пример кода из erlang gen_tcp документация.

start(LPort) ->
    case gen_tcp:listen(LPort,[{active, false},{packet,2}]) of
        {ok, ListenSock} ->
            spawn(fun() -> server(LS) end);
        {error,Reason} ->
            {error,Reason}
    end.

server(LS) ->
    case gen_tcp:accept(LS) of
        {ok,S} ->
            loop(S),
            server(LS);
        Other ->
            io:format("accept returned ~w - goodbye!~n",[Other]),
            ok
    end.

loop(S) ->
    inet:setopts(S,[{active,once}]),
    receive
        {tcp,S,Data} ->
            Answer = do_something_with(Data), 
            gen_tcp:send(S,Answer),
            loop(S);
        {tcp_closed,S} ->
            io:format("Socket ~w closed [~w]~n",[S,self()]),
            ok
    end.
0 голосов
/ 04 мая 2011

вы используете отдельный связанный процесс для обработки команд от каждого клиента? Если это так, вы можете думать о захвате выходов в основном процессе ...

...