0

私は erlang とコマンド ハンドラーで書かれた tcp サーバーを持っています。クライアントがサーバーに接続してから閉じた場合、ネットワークの切断をどのようにキャッチできますか?

4

2 に答える 2

8

サーバーを実装するためにバニラのgen_tcpを使用していると思います。その場合、アクセプター プロセス (Socket を渡すプロセス) は、ソケットがクライアント エンドから閉じられると、{tcp_closed, Socket} メッセージを受け取ります。

erlang gen_tcpドキュメントのサンプル コード。

開始 (LPort) ->
    case gen_tcp:listen(LPort,[{active, false},{packet,2}]) の
        {わかりました、ListenSock} ->
            spawn(fun() -> server(LS) end);
        {エラー、理由} ->
            {エラー、理由}
    終わり。

サーバー(LS) ->
    case gen_tcp:accept(LS) の
        {わかりました、S} ->
            ループ(S)、
            サーバー (LS);
        その他 ->
            io:format("返されたものを受け入れる ~w - さようなら!~n",[その他]),
            わかった
    終わり。

ループ(S) ->
    inet:setopts(S,[{active,once}]),
    受け取る
        {tcp、S、データ} ->
            答え = do_something_with(データ),
            gen_tcp:send(S,応答),
            ループ(S);
        {tcp_closed,S} ->
            io:format("ソケット ~w クローズ [~w]~n",[S,self()]),
            わかった
    終わり。
于 2011-05-04T10:01:47.560 に答える
0

各クライアントからのコマンドを処理するために、個別のリンクされたプロセスを使用していますか?もしそうなら、あなたはメインプロセスで出口をトラップすることを考えることができます...

于 2011-05-04T09:01:42.860 に答える