Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 23 Aug 96 15:15:20 EDT
From:      eischen@vigrid.com (Daniel Eischen)
To:        hackers@FreeBSD.org, nate@mt.sri.com
Cc:        nate@rocky.mt.sri.com
Subject:   Re:  Non-blocking I/O on sockets and closed sockets?
Message-ID:  <9608231915.AA14731@pcnet1.pcnet.com>

next in thread | raw e-mail | index | archive | help
> I need to setup my sockets as non-blocking to avoid some problems, but
> it brings up a problem of determining if the remote end has closed the
> connection.  Normally, if you run select() on a FD, and the subsequent
> read() call returns 0 you can assume the socket is dead.  However, with
> non-blocking I/O a read of 0 does *NOT* mean the socket is dead.
> 
> Will read() return a negative error code on a socket if the socket is
> closed/dead?  I've looked in Steven's and in the obvious manpages, but
> nothing jumps out at me.
> 
> Here's the code snippet which should explain what goes on.

If the socket is non-blocking, then you should expect errno to be
EAGAIN on a read with no data present.  You probably only need
something like this:

[...]
      /*
       * We may have more data than can fit in lbuff, so read in lbuff
       * size chunks.
       * XXX - How do we determine if the socket is closed?
       */
      do {
        i = read(data->stream_sock, lbuff, 512);
        if ( i > 0 )
          save_data(lbuff, i);
        else {
          if (errno != EAGAIN)
            /* handle error on socket */
            ;
          }
      } while ( i > 0 );
    }
  }
}

Dan Eischen
eischen@pcnet.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9608231915.AA14731>