2011-05-04 107 views
0

我有写在erlang和命令处理程序的tcp服务器。如果客户端连接到我的服务器,然后关闭如何捕捉网络断开连接?Erlang捕获断开客户端

+1

请提供更多的细节,也许一些代码。 – 2011-05-04 08:32:07

回答

8

我认为你用香草gen_tcp来实现你的服务器。 在这种情况下,当套接字从客户端关闭时,acceptor进程(您传递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

您是否使用单独的链接过程来处理来自每个客户端的命令? 如果是这样,你可以想到在主进程陷阱出口...