Can someone provide me an example of how to use select() to see if a client has closed the connection on a socket?
FYI. I\'m using linux.
Thanks!
You don't need to do a select() followed by ioctl(). You can instead do a non-blocking peek on the socket to see if it returns 0.
bool isclosed (int sock) {
char x;
interrupted:
ssize_t r = ::recv(sock, &x, 1, MSG_DONTWAIT|MSG_PEEK);
if (r < 0) {
switch (errno) {
case EINTR: goto interrupted;
case EAGAIN: break; /* empty rx queue */
case ETIMEDOUT: break; /* recv timeout */
case ENOTCONN: break; /* not connected yet */
default: throw(errno);
}
}
return r == 0;
}