[erlang-questions] tcp connections dropped in gen_server

Reynaldo Baquerizo <>
Wed Sep 7 12:55:35 CEST 2011


> [I hope it's ok that I reply to the list - someone else might find
> this information useful as well. I am mentioning this only because
> you keep replying to me privately.]

Ooops, apologies ... I certainly didn't mean to write to you alone.

> It makes very little sense to restart these processes (to me), because
> the TCP connection will die as well. The external client can reconnect
> and start anew. Or am I missing something?

Indeed, the client will reconnect. But I think I found the problem. The
process that is listening for new connections in gen_tcp:accept/1 dies
at some point, all other processes with established connections are fine
but eventually crash (cause of bad input), no further reconnections
will be possible.

How can I isolate the listening process? or reestructure to restart it
if it crashes?

At the end, I simplified it and have this:

-module(comm_tcp).
-export([start_link/2, acceptor/2]).

start_link(SupPid, ListenSocket) ->
    {ok, proc_lib:spawn_link(?MODULE, acceptor, [SupPid, ListenSocket])}.

acceptor(SupPid, ListenSocket) ->
    {ok, Socket} = gen_tcp:accept(ListenSocket),
    {ok, Pid} = comm_client_sup:start_child(SupPid),
    %% gen_tcp:controlling_process(Socket, Pid),
    error_logger:info_msg("New connection from ~p~n", [Socket]),
    inet:setopts(Socket, [binary, {nodelay, true}, {active, true}]),
    loop(Socket).

loop(Socket) ->
    receive
	{tcp, Socket, Data} ->
	    error_logger:info_msg("Messaged received from ~p: ~p~n",[Socket, Data]),
            comm_lib:handle_message(Socket, Data),
	    loop(Socket);
	{tcp_closed, Socket} ->
	    error_logger:info_msg("Device at ~p disconnected~n",[Socket]); 
        _Any ->
	     loop(Socket)
    end.

--
Reynaldo




More information about the erlang-questions mailing list