Interview Questions

How can I tell when a socket is closed on the other end?

Unix Socket FAQ for Network programming


(Continued from previous question...)

How can I tell when a socket is closed on the other end?

If the peer calls close() or exits, without
having messed with   SO_LINGER, then our
calls to read() should return 0. It is 
less clear   what happens to write() calls
in this case; I would expect EPIPE, not
on the next call, but the one after.

If the peer reboots, or sets l_onoff = 1,
l_linger = 0 and then   closes, then we 
should get ECONNRESET (eventually) from 
read(), or   EPIPE from write().

When write() returns EPIPE, it also 
raises the SIGPIPE signal - you never
see the EPIPE error unless you
handle or ignore the signal.

 If the peer remains unreachable, 
 we should get some other error.

Don't think that write() can legitimately
return 0.  read() should   return 0 on 
receipt of a FIN from the peer, and on
all following calls.

So yes, you must expect read() to return 0.

As an example, suppose you are receiving
a file down a TCP link; you
might handle the return from read() like this:

  rc = read(sock,buf,sizeof(buf));
  if (rc > 0)
  {
      write(file,buf,rc);
      /* error checking on file omitted */
  }
  else if (rc == 0)
  {
      close(file);
      close(sock);
      /* file received successfully */
  }
  else /* rc < 0 */
  {
/* close file and delete it, since data 
is not complete report error, or whatever */
  }

(Continued on next question...)

Other Interview Questions