2011-05-04 80 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

您是否使用單獨的鏈接過程來處理來自每個客戶端的命令? 如果是這樣,你可以想到在主進程陷阱出口...