使用Linux套接字检测TCP重置

时间:2015-05-22 08:32:15

标签: c linux sockets tcp

当TCP链路的一端断开连接时,它会向另一端发送重置(RST)消息。我希望能够在应用程序层中收到它。

在我的代码中,我使用select()调用来接收来自潜在多个源的输入,包括TCP连接。我已经看到,当select()显示数据已准备好在连接上读取时,然后read()调用返回0字节读取,这是在通过TCP发送RST之后发生的。 (我了解recv()read()的工作方式类似。)

仅当连接重置时,read()是否在TCP连接上返回0字节(select()之后)?在任何其他情况下它是否会返回0个字节?

我记得前一段时间在连接的另一端使用了一个特定的以太网设备,而这个Linux端在select()之后收到了0个字节,但没有用于连接重置,而是在中途通过一些数据流。我在Wireshark中确认收到的数据包有0个数据字节。这是一个错误,或者像上面的问题一样,这种行为是否有效?我不记得它是几年前的设备,但它使用的是Windows驱动程序。

2 个答案:

答案 0 :(得分:9)

  

当TCP链路的一端断开连接时,它会向另一端发送重置(RST)消息。

不正常。

  

我希望能够在应用程序层中收到它。

你会。

  

我已经看到当select()显示连接上有数据准备好读取,然后read()调用返回0字节读取,这是在通过TCP发送RST之后发生的。 / p>

没有

  

只有连接被重置时,read()才会在TCP连接上返回0个字节(在select()之后)吗?

如果连接已重置,则

从不。在这种情况下,它返回-1并带有errno == ECONNRESET

  

在任何其他情况下它是否会返回0个字节?

当且仅当收到FIN时才返回零,即对等方关闭连接,或关闭其套接字输出。

答案 1 :(得分:0)

如果您尝试连接到没有监听器的服务器上的端口,您也会获得RST。

假设您已连接到服务器并定期向其发送数据,但随后服务器重新启动,您的套接字对当然不再存在,然后您也会获得RST。

服务器可以使用我认为的套接字选项发送RST,但这不是一个好主意,服务器/客户端应该在正常情况下使用套接字正常关闭,他们希望关闭通信,让TCP的4路握手做到这一点。