<分区>
我正在使用 Linux。
谁能给我一个例子,说明如何使用 select() 或 poll() 检查 TCP 连接是被对等方通过 FIN 关闭还是被 RST 终止?
poll() 可以通过在 revents 中设置 POLLHUP 或 POLLERR 来检测 RST,但是 select() 没有这样的功能。
在我的测试中,当套接字被 RST 终止时,getsockopt 得到的套接字错误将是 ECONNRESET。这是一种有效的方法吗?
是否需要确定连接是如何关闭的?
谢谢!
<分区>
我正在使用 Linux。
谁能给我一个例子,说明如何使用 select() 或 poll() 检查 TCP 连接是被对等方通过 FIN 关闭还是被 RST 终止?
poll() 可以通过在 revents 中设置 POLLHUP 或 POLLERR 来检测 RST,但是 select() 没有这样的功能。
在我的测试中,当套接字被 RST 终止时,getsockopt 得到的套接字错误将是 ECONNRESET。这是一种有效的方法吗?
是否需要确定连接是如何关闭的?
谢谢!
最佳答案
如果套接字正常关闭,套接字将被设置为读取。 然后,当你读取时,你将收到 0 数据读取,因为你到达了 EOF。您也可以检查
ioctl(sock, FIONREAD, &n);
判断是否有数据可读。这里有一个例子:c++ how to use select to see if a socket has closed
根据 select man : "将监视 readfds 以查看字符是否可供读取(更准确地说,查看读取是否不会阻塞;特别是,文件描述符也在文件末尾准备就绪)"
如果有挂起的套接字错误,将在readfds或writefds中设置相应的位。然后 read 或 recv 应该返回错误。您也可以使用它来确定套接字中是否存在未决错误:
if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &result, &resultLen) < 0) {
//getsockopt ERROR
} else if (result == 0) {
//NO ERROR
} else {
//SOCKET ERROR
}
关于c - 如何在不读取 TCP 连接的情况下检查 TCP 连接是否被对等方正常关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38815832/