当TCP链路的一端断开连接时,它会向另一端发送重置(RST)消息。我希望能够在应用程序层中收到它。
在我的代码中,我使用select()
调用来接收来自潜在多个源的输入,包括TCP连接。我已经看到,当select()
显示数据已准备好在连接上读取时,然后read()
调用返回0字节读取,这是在通过TCP发送RST之后发生的。 (我了解recv()
与read()
的工作方式类似。)
仅当连接重置时,read()
是否在TCP连接上返回0字节(select()
之后)?在任何其他情况下它是否会返回0个字节?
我记得前一段时间在连接的另一端使用了一个特定的以太网设备,而这个Linux端在select()
之后收到了0个字节,但没有用于连接重置,而是在中途通过一些数据流。我在Wireshark中确认收到的数据包有0个数据字节。这是一个错误,或者像上面的问题一样,这种行为是否有效?我不记得它是几年前的设备,但它使用的是Windows驱动程序。
答案 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路握手做到这一点。