1.

How Can I Tell When A Socket Is Closed On The Other End?

Answer»

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 */

}

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 */

}



Discussion

No Comment Found