【问题标题】:If no data is received over stream tcpclient close the connection如果没有通过流 tcpclient 接收到数据,则关闭连接
【发布时间】:2015-12-26 23:14:02
【问题描述】:

我想知道在TcpClientNetworkStream 上如果发生超时究竟会发生什么。

在调试代码时,我发现在发送请求后,如果在提到的超时期限内没有收到数据,它会抛出异常并不幸关闭连接(TcpClient.Connected 变为 false):

无法从传输连接中读取数据:连接 尝试失败,因为连接方没有正确响应 一段时间后,或建立连接失败,因为 连接的主机未能响应。

抛出异常没关系,但我想知道如何防止它关闭连接。

如果有人能就此提供更多见解,那就太好了。

【问题讨论】:

  • 通常,服务器的设计方式是在客户端不活动一段时间后强制关闭连接。这允许更有效地利用服务器资源。但看看你的信息,我想,这不是你的情况。看起来您只是无法连接到您的服务器。请发布 MCVE (stackoverflow.com/help/mcve)。
  • 如果连接从未完成,您将无法保持打开状态。所以我假设超时发生在初始连接之后。如果服务器关闭连接,则您无法阻止连接关闭。通常,服务器会在空闲时关闭连接。在这种情况下,您使用 KeepAlive 选项,该选项会定期向服务器发送空数据报,因此服务器不会关闭连接。
  • 该异常意味着您的 Connect 调用失败。这与阅读无关。尚未建立连接。邮政编码。由于缺少代码,暂时关闭。无法诊断。

标签: c# .net-3.5 tcpclient


【解决方案1】:

你检查过这个吗? Reconnect TCPClient after interruption 我认为如果您的 TCP 连接的 TTL 足够长,如果发生异常(我相信您会被抛出 SocketException),您可以赶上并启动您的重试逻辑。有几种实现方式,显然这取决于用例,但通常在“放弃”连接之前有很多尝试(配置值)。这样,您的经理将重试连接 X 次,如果连接成功则继续连接,否则将在链中向上传播异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2013-04-27
    • 1970-01-01
    • 2020-11-13
    • 2020-05-15
    • 1970-01-01
    相关资源
    最近更新 更多