How to check if a TCP socket is closed

Erik Reitsma (RY/ETM) <>
Mon Feb 27 13:54:27 CET 2006


Hi all,

I have a TCP socket that is opened with {active, false}. Then I enter a
receive clause (in a loop) in which I do not want to read from the
socket, but I want to be informed when the socket is closed by the peer.
I have not found a solution other than the following.

loop(Socket) ->
    receive
	something ->
	   do_something()
    after 2000 ->
	    %% read from the socket to see if we can, timeout=0
	    case catch gen_tcp:recv(Socket, 0, 0) of
		{error, timeout} ->
		    %% this is normal: no data
		    loop(Socket);
		{error, Reason} ->
		    %% something wrong with the socket, we're done
		    done;
		{'EXIT', Reason} ->
		    %% something worse with the socket, report it	
		    {error, Reason};
		{ok, Data} ->
		    %% got some data, store it for when we really need
it (in some gen_tcp:recv/2)
		    catch gen_tcp:unrecv(Args#arg.clisock, Data),
		    loop(Socket)
	    end
    end.

I was looking for a way to check if a socket is closed without reading
from it, and a way to make a socket 'active' only for non-data messages.
Any suggestions?
I actually want to do this in a page in Yaws, so I do not have much
freedom to make the socket 'active'.

*Erik.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20060227/7c82284e/attachment.html>


More information about the erlang-questions mailing list