c# - 当 TCP 连接终止时,如何通知任何一方?

标签 c# sockets tcp

假设我们有一个带有 .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/

相关文章:

c# - 组合框选定值

c# - 在 linq 中返回选择查询的最佳实践

c++ - 如何确定客户端缓冲区的长度

mysql - 重用数据库连接池中的连接

c - recv() 未由 libevent 触发

c# - 我可以从共享接口(interface)继承我的 WCF DataContract 吗?

c# - 为什么要用blank get;放; C# 中的访问器?

java - 当远程套接字的设备关闭或应用程序强制关闭时,如何理解 java 远程套接字无法访问

Swift 通过 TCP 套接字发送十六进制数据

c++ - TCP 代理 - 互斥量