如何正确地检查TCP连接是否被对等关闭而没有从它读取?

时间:2016-08-07 15:48:12

标签: c sockets networking tcp network-protocols

我正在使用Linux。

有人可以举例说明如何使用select()或poll()检查TCP连接是通过FIN关闭还是通过RST终止?

poll()可以在revents中设置POLLHUP或POLLERR来检测RST,但select()没有这样的设施。

在我的测试中,当套接字被RST终止时,getsockopt获得的套接字错误将是ECONNRESET。这是否有效?

是否有必要确定连接是如何关闭的?

谢谢!

1 个答案:

答案 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
}