【问题标题】:How to detect non-graceful disconnect of Twisted on Linux?如何在 Linux 上检测 Twisted 的非正常断开连接?
【发布时间】:2010-06-09 06:12:15
【问题描述】:

我基于Twisted写了一个服务器,遇到一个问题,有些客户端断开连接不优雅。比如用户拔出网线。

有一段时间,Windows上的客户端断开连接(调用connectionLost,也是用Twisted写的)。而在 Linux 服务器端,我的 connectionLost of twisted 永远不会被触发。甚至当连接丢失时它也会尝试将数据写入客户端。为什么 Twisted 在 Linux 上无法检测到那些非正常断开连接(甚至向客户端写入数据)?如何让 Twisted 检测到非正常断开连接?因为 Twisted 功能无法检测到非优雅,所以我的服务器上有很多僵尸用户。

---- 更新----

我认为这可能是类 unix 操作系统的套接字的特性,那么,类 unix 上的套接字在处理这种情况时的行为是什么?

谢谢。 维克多·林。

【问题讨论】:

    标签: python networking twisted


    【解决方案1】:

    您正在描述 TCP 连接在不可靠网络上的行为。 Twisted 只是暴露了这种行为:毕竟,当你与 Twisted 建立 TCP 连接时,它只不过是一个 TCP 连接。

    当您说即使您尝试通过它发送数据也不会调用connectionLost 回调,您就错了。两分钟后,底层 TCP 连接将消失,Twisted 将通过调用connectionLost 通知您。

    如果您需要比这更快地检测到这种情况,那么您可以使用reactor.callLater 实现自己的超时。

    【讨论】:

    • 您能解释一下如何使用 callLater 来检测断开连接吗?
    • 它不会“检测”断开连接。您可以使用它来实现一个策略,您可以在 TCP 破坏虚拟电路之前任意决定连接不再可用。您可以说,如果您在发送消息后 10 秒内没有收到任何响应,则连接已死。 callLater 只是让您能够在 10 秒后运行一个函数。如果您以这种方式解决问题,那么您将编写一个调用loseConnection 并使用c = reactor.callLater(10, thatFunction) 的函数。当你收到数据时,你会c.cancel()
    【解决方案2】:

    接着 Jean-Paul 所说,如果您需要更细粒度的 TCP 连接管理,只需使用 reactor.CallLater。我们在 Twisted/wxPython 交易平台上就实现了这一点,而且效果很好。您可能还想调整 ReconnectingClientFactory 的行为,以达到我理解您正在寻找的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多