<div dir="ltr"><div><div><div><div><div>Basically, this has everything to do with TCP sockets (and the OS implementation) and very little to do with Erlang.  I do get {error, closed} from gen_tcp:send when the client disconnects.  I'm running R16B03-1 on FreeBSD 10.<br>
</div></div><div><br></div><div>Here are some decent descriptions of the problem:<br><br><a href="http://www.linuxquestions.org/questions/programming-9/how-could-server-detect-closed-client-socket-using-tcp-and-c-824615/">http://www.linuxquestions.org/questions/programming-9/how-could-server-detect-closed-client-socket-using-tcp-and-c-824615/</a><br>
</div><div><br></div><div>The second answer in the page above has some good links too, pulled out for easy reference:<br><br><a href="http://stackoverflow.com/questions/722240/instantly-detect-client-disconnection-from-server-socket">http://stackoverflow.com/questions/722240/instantly-detect-client-disconnection-from-server-socket</a><br>
<a href="http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.8">http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-2.html#ss2.8</a><br>
</div><div><br></div></div><div>-Garret<br></div></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Apr 8, 2014 at 1:40 PM, Fred Hebert <span dir="ltr"><<a href="mailto:mononcqc@ferd.ca" target="_blank">mononcqc@ferd.ca</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi there,<br>
<br>
Happy fun case we're hitting on nodes using Erlang right now. We have an<br>
HTTP proxy that does direct data streaming from a server to a client.<br>
This is done through a series of recv from the server, and of sends to<br>
the client. The TCP sockets involved are all in passive mode.<br>
<br>
The problem with this approach is that because this is a purely<br>
unidirectional stream until the server says so or the client quits, we'd<br>
like to detect both of these events.<br>
<br>
The server quitting or being done is easy enough, but the client<br>
quitting cannot be detected, apparently.<br>
<br>
It turns out that gen_tcp:send/2 always returns 'ok' even if the<br>
connection has been closed by the peer before. Erlang/OTP just won't<br>
acknowledge the fact unless someone tries to read from the socket,<br>
either through gen_tcp:recv or by using inet:setopts(Port, [{active,<br>
once}]), at which point {error, closed} starts being returned by<br>
gen_tcp:send/2. This happens, even if `{exit_on_close, true}` is<br>
specified as an option.<br>
<br>
The question I have here is why is this behavior different for send than<br>
recv. It seems that `gen_tcp:send` will happily wait for hours<br>
pretending to send data (no matter the timeout values used are), even<br>
once the connection has been closed by the other peer.<br>
<br>
Is there any way for me to detect that a connection has been closed<br>
without possibly having to poll `recv` on each packet I try to send (and<br>
then may need to buffer all that data, which I'd prefer to avoid) or<br>
changing the entire app's workflow to be active?<br>
<br>
In case, here are the socket options we use:<br>
<br>
    [{active,false},<br>
     {broadcast,false},<br>
     {buffer,1460},<br>
     {delay_send,false},<br>
     {dontroute,false},<br>
     {exit_on_close,true},<br>
     {header,0},<br>
     {high_watermark,8192},<br>
     {keepalive,false},<br>
     {linger,{false,0}},<br>
     {low_watermark,4096},<br>
     {mode,binary},<br>
     {nodelay,true},<br>
     {packet,0},<br>
     {packet_size,0},<br>
     {priority,0},<br>
     {recbuf,87380},<br>
     {reuseaddr,true},<br>
     {send_timeout,infinity},<br>
     {sndbuf,65536}]<br>
<br>
Regards,<br>
Fred.<br>
_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br></div>