我正在使用Linux。
有人可以举例说明如何使用select()或poll()检查TCP连接是通过FIN关闭还是通过RST终止?
poll()可以在revents中设置POLLHUP或POLLERR来检测RST,但select()没有这样的设施。
在我的测试中,当套接字被RST终止时,getsockopt获得的套接字错误将是ECONNRESET。这是否有效?
是否有必要确定连接是如何关闭的?
谢谢!
答案 0 :(得分:0)
如果套接字正常关闭,则套接字将设置为read。 然后,当您阅读时,您将收到0个数据,因为您需要EOF。您也可以查看
ioctl(sock, FIONREAD, &n);
确定是否有要读取的数据。这里有一个例子:c++ how to use select to see if a socket has closed
根据select man:“将观察readfds以查看字符是否可用于读取(更确切地说,查看读取是否不会阻塞;特别是,文件描述符也已准备就绪 - -file)“
如果存在挂起的套接字错误,则相应的位将在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
}