2010-06-09 80 views
4

我写了一个基于Twisted的服务器,而且我遇到了一个问题,有些客户端连接不够优雅。例如,用户拔出网线。如何检测Linux上扭曲的非正常断开连接?

有一段时间,Windows上的客户端断开连接(connectionLost被调用,并且它也被写入Twisted中)。而在Linux服务器端,我的连接失败永远不会被触发。即使它试图在连接丢失时将数据写入客户端。为什么Twisted在Linux上无法检测到这些非优雅的断开连接(甚至是将数据写入客户端)?如何使扭曲检测非优雅断线?由于Twisted功能无法检测到非优雅,我的服务器上有很多僵尸用户。

---- ----更新

我想这可能是类Unix系统的插座的功能,所以,什么是插座上的行为类似于Unix的处理情况也是这样吗?

谢谢。 Victor Lin。

回答

3

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

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

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

+0

你能解释一下callLater如何用来检测断开连接吗? – 2010-11-30 20:22:34

+1

它不会“检测”断开连接。您可以使用它来实施策略,在TCP断开虚拟电路之前,您可以任意决定连接不再可用。您可以说,如果您在发送消息后的10秒内没有收到任何回复,则说明连接已中止。 callLater只让你有能力在10秒后运行一个函数。如果你用这种方式处理问题,那么你会编写一个调用'loseConnection'并使用'c = reactor.callLater(10,thatFunction)'的函数。当你接收到数据时,你会'c.cancel()'。 – 2010-12-02 03:11:38

1

借用让 - 保罗说的话,如果你需要更细粒度的TCP连接管理,只需使用reactor.CallLater。我们在Twisted/wxPython交易平台上完全实现了该功能,并且它可以起到一定的作用。您可能还想调整ReconnectingClientFactory的行为,以获得我了解您的需求的结果。