如何解决c ++如何使用select查看套接字是否已关闭
| 有人可以给我提供一个示例,说明如何使用select()查看客户端是否已关闭套接字上的连接吗? 仅供参考。我正在使用linux。 谢谢!解决方法
下面的代码段首先检查套接字是否标记为可读(关闭时为已标记),然后检查是否确实有要读取的内容。
#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,&tv);
if (!FD_ISSET(sock,&rfd))
return false;
int n = 0;
ioctl(sock,FIONREAD,&n);
return n == 0;
}
,您不需要先进行select()
,然后再进行ioctl()
。您可以改为对套接字进行无阻塞的窥视,以查看其是否返回“ 3”。
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(第三组)。
如果客户端异常终止关闭,您将不知道。这受到两个将军问题的困扰。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。