Erlang catch 断开客户端连接

发布于 2024-11-05 13:38:16 字数 67 浏览 5 评论 0原文

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

I have tcp server written in erlang and command handler. If client connect to my server, and then closing how can i catch network disconnect?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一身仙ぐ女味 2024-11-12 13:38:16

我假设您正在使用 vanilla gen_tcp 来实现您的服务器。
在这种情况下,当客户端关闭套接字时,接受进程(将 Socket 传递给的进程)将收到一条 {tcp_close, 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.

I presume u are using vanilla gen_tcp to implement your server.
In which case, acceptor process (the process you pass the Socket to) will receive a {tcp_closed, Socket} message when the socket is closed from the client end.

sample code from the erlang gen_tcp documentation.

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.
凡尘雨 2024-11-12 13:38:16

您是否使用单独的链接进程来处理来自每个客户端的命令?
如果是这样,你可以考虑在主进程中捕获退出......

are you using a separate linked process to handle commands from each client?
if so you can think of trapping exits in the main process...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文