c ++如何使用select来查看套接字是否已经closures

有人可以提供一个如何使用select()查看客户端是否closures套接字连接的例子吗?

仅供参考。 我正在使用Linux。

谢谢!

Solutions Collecting From Web of "c ++如何使用select来查看套接字是否已经closures"

下面的代码片段首先检查套接字是否被标记为可读(当它关闭时),然后如果实际上有什么要读取的话。

#include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <sys/ioctl.h> bool isclosed(int sock) { fd_set rfd; FD_ZERO(&rfd); FD_SET(sock, &rfd); timeval tv = { 0 }; select(sock+1, &rfd, 0, 0, &tv); if (!FD_ISSET(sock, &rfd)) return false; int n = 0; ioctl(sock, FIONREAD, &n); return n == 0; } 

你不需要做一个select()接着是ioctl() 。 你可以在套接字上做一个非阻塞的窥视,看它是否返回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; } 

如果您得到一个读取通知,并且读取返回0字节客户端已经干净地退出。 如果没有,你会得到一个异常通知。

如果客户端已经关闭干净,你应该得到通知:READ不会被阻塞,EXCEPTION(第三组)被标记。

如果客户关闭了,你不知道。 这是受两个将军问题的影响。