Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #38969

Re: server-side Socket does not recognize broken connection.

From Eric Sosman <esosman@comcast-dot-net.invalid>
Newsgroups comp.lang.java.programmer
Subject Re: server-side Socket does not recognize broken connection.
Date 2019-05-29 08:30 -0400
Organization A noiseless patient Spider
Message-ID <qclu0s$gh$1@dont-email.me> (permalink)
References <slrnqespnm.cfl.avl@logic.at>

Show all headers | View raw


On 5/29/2019 7:03 AM, Andreas Leitgeb wrote:
> I have a ServerSocket on some port. whenever ".accept()" returns a
> connection, it goes to a loop that (among doing other stuff) polls
> the socket's input stream's ".available()" and if it returns > 0
> it reads and processes that data.  (SSCCE at end of post)
> 
> A client (e.g. using plain old "telnet" on unix) connects, types a
> bit, then breaks the connection using Ctrl-] and "close", and is back
> on the shell. (closing the terminal window that's running telnet
> has same effect, ditto killing the telnet process - apparently
> whatever breaks, or even properly shuts down the connection from
> client side.)
> 
> The Socket on server side, however keeps reporting 0 on .available(),
> rather than throwing some exception for the broken socket.
> 
> Single stepping the .available() method (class AbstractPlainSocketImpl)
> shows that it just never receives the ConnectionResetException, and thus
> won't ever get to throw new IOException("Stream closed.") itself.
> Field resetState never changes away from CONNECTION_NOT_RESET.
> 
> What am I doing wrong wrt. EOF-detection in ".available()" ?

     Using available(), I think.  :)

     available() reports (or estimates) the number of bytes that can be
read without blocking, that is, the number of bytes already received
and buffered.  "My buffer is empty right now" is not the same thing as
"There will never be any more input," so available()==0 is not a test
for EOF.  It is true that once you've read all the bytes that will
ever appear you will find available()==0, but the implication is
one-directional.

     To discover that the socket has been closed, I think you must
actually attempt to read something.  The documentation for available()
doesn't say so explicitly -- but then, there are so many different
implementations of InputStream that documenting the exact behavior
of all of them would be daunting or perhaps even impossible.

> PS: The real code does more interesting stuff while no input is available,
> so it cannot wait blockingly.  The real code also has other exits from the
> loop (based on input received), but that's not relevant for this SSCCE.

     One approach (there might be others) would be to create a thread
that just calls read() until it gets an exception, depositing the input
in a Queue (or similar) that the main line can poll() without blocking.
At EOF or other exception, the reading thread would enqueue a "poison
pill" to alert the main line that something's amiss.

-- 
esosman@comcast-dot-net.invalid
Six hundred two days to go.

Back to comp.lang.java.programmer | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

server-side Socket does not recognize broken connection. Andreas Leitgeb <avl@logic.at> - 2019-05-29 11:03 +0000
  Re: server-side Socket does not recognize broken connection. Eric Sosman <esosman@comcast-dot-net.invalid> - 2019-05-29 08:30 -0400
  Re: server-side Socket does not recognize broken connection. Joerg Meier <joergmmeier@arcor.de> - 2019-05-29 14:58 +0200
    Re: server-side Socket does not recognize broken connection. Andreas Leitgeb <avl@logic.at> - 2019-05-29 14:50 +0000
      Re: server-side Socket does not recognize broken connection. Eric Douglas <e.d.programmer@gmail.com> - 2019-05-29 08:22 -0700
        Re: server-side Socket does not recognize broken connection. Andreas Leitgeb <avl@logic.at> - 2020-01-30 15:22 +0000
      Re: server-side Socket does not recognize broken connection. Martin Gregorie <martin@mydomain.invalid> - 2019-05-29 16:06 +0000
  Re: server-side Socket does not recognize broken connection. Eric Douglas <e.d.programmer@gmail.com> - 2019-05-29 07:14 -0700
  Re: server-side Socket does not recognize broken connection. trisha guillot <guillottrisha347@gmail.com> - 2019-05-31 20:13 -0700
  Re: server-side Socket does not recognize broken connection. Marcel Mueller <news.5.maazl@spamgourmet.org> - 2019-06-01 16:08 +0200

csiph-web