假设我们有一个带有 .NET TcpListener
的基本 TCP 服务器,以及一个使用 .NET TcpClient
的基本 TCP 客户端。
有哪些类型的连接终止,应该如何检查和处理它们?
客户端
一个。客户端优雅地终止连接。通知服务器。
B.客户端与网络物理断开连接。服务器怎么知道的?
C.客户端程序在没有正常断开连接的情况下关闭。服务器怎么知道的?
服务器
一个。服务器优雅地终止连接。通知客户。
B.服务器与网络物理断开连接。客户怎么知道的?
C.服务器程序在没有正常断开连接的情况下关闭。客户怎么知道的?
最佳答案
情况 A 和 C 是通过在 header 中设置了 FIN
标志的 TCP 数据包进行通信的。它是由 OS 中的 TCP/IP 堆栈发送的,因此应用程序是否异常退出无关紧要。操作系统也失败的 C 的子情况将改为像 B。
情况 B,当您失去沟通能力时,情况会更加复杂。如果故障是本地的(例如与 WiFi 接入点断开连接),则连接的本地端将立即发现网络状态的变化,并可以推断连接已断开(但如果未清除,则连接可以在短期中断中幸存下来)。
如果连接正在主动传输数据,确认将超时并导致重传尝试。可能会对重传尝试施加限制,从而导致错误。
如果没有流量,则可能会在很长时间(多天)内检测不到连接丢失。出于这个原因,TCP 连接通常被配置为发送必须确认的心跳数据包,并以与正常数据相同的方式检测重传尝试的失败。
关于c# - 当 TCP 连接终止时,如何通知任何一方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981859/