繁体   English   中英

使用Linux套接字检测TCP重置

[英]Detecting a TCP reset with Linux sockets

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

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

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

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

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

不正常。

我希望能够在应用程序层中收到此信息。

你会。

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

没有。

仅当连接被重置时,read()是否在TCP连接上返回0字节(在select()之后)?

从不重置连接。 在这种情况下,它返回-1,并且errno == ECONNRESET

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM