【问题标题】:Detect a non-gracefull disconnect in C#在 C# 中检测非正常断开连接
【发布时间】:2016-04-15 03:19:37
【问题描述】:

我正在尝试创建一个服务器/客户端应用程序,其中服务器将数据发送到客户端,客户端将数据发回。但由于某种原因,我无法让它工作,因为我不知道如何在不写入数据的情况下检测非正常断开连接(我无法写入数据,因为缓冲区将充满我不需要的错误数据)。还有另一种方法吗?我正在使用 TCP。

【问题讨论】:

  • TCP 旨在优雅地处理连接中断。 TCP 从消失的连接中恢复的能力是一个特性,而不是一个错误。换句话说:如果没有通信正在进行,没有断开。当您确实需要知道对方是否还活着时,传统的解决方案是在协议中加入一个周期性的心跳:一些除了通过响应确认对方仍然存在之外什么都不做的操作。如果没有这样的操作,人们偶尔会使用零字节写入,但这并不完全可靠。

标签: c# sockets tcp


【解决方案1】:

您正在描述 TCP 连接在不可靠网络上的行为。所以你需要使用其他协议。来看看

TCP C#

【讨论】:

  • 这是一个可靠的网络但是如果服务器断开连接我不想手动重新连接我的所有客户端。
  • 你使用的是什么协议?
  • @JesseVlietveld 那么你应该能够检测到 TCP 是否断开
  • 是的,如果它优雅地完成。但是非优雅的断开连接要困难得多。
【解决方案2】:

我不确定我是否完全理解问题,但您可以检查您的套接字是否仍然连接:

public bool IsSocketConnected(Socket socket) {
    return !(socket.Poll(0, SelectMode.SelectRead) && socket.Available == 0) && socket.Connected;
}

【讨论】:

  • 谢谢。这适用于优雅断开连接。但不适用于非正常断开连接。 (当服务器网络随机断开时)
  • 决定超时(除了示例中的0)可能是务实的解决方案。如果断开连接不正常,那么“幸存”端将被困在连接状态,直到它接收到改变状态的字(它不能,因为那个字必须来自断开连接的一侧),或者引入了超时机制。
【解决方案3】:

我已经用 KeepAlive 功能修复了它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    相关资源
    最近更新 更多