如何检测Linux上Twisted的不正常断开?
我写了一个基于Twisted的服务器,但遇到了一个问题,有些客户端断开连接的方式不太优雅。比如说,用户拔掉了网线。
在Windows上,客户端会在一段时间后断开连接(会调用connectionLost,这在Twisted中也有写)。但是在Linux服务器上,我的Twisted的connectionLost却从来没有被触发。甚至在连接断开时,它还试图向客户端发送数据。为什么Twisted在Linux上无法检测到这些不优雅的断开连接(甚至在连接断开时还写数据给客户端)呢?我该如何让Twisted检测到不优雅的断开连接?因为Twisted无法检测这些不优雅的断开,我的服务器上有很多“僵尸用户”。
---- 更新 ----
我想这可能是类Unix操作系统的socket特性,那么在类Unix系统中,socket在处理这种情况时的表现是什么样的呢?
谢谢。
Victor Lin.
2 个回答
我赞同Jean-Paul的说法,如果你需要更细致的TCP连接管理,可以使用reactor.CallLater。我们在一个使用Twisted和wxPython的交易平台上正好有这样的实现,而且效果很好。你可能还想调整一下ReconnectingClientFactory的行为,以达到你想要的效果。
你在描述一个不太可靠的网络上TCP连接的表现。Twisted只是把这种表现展现出来:毕竟,当你用Twisted建立一个TCP连接时,它其实就是一个普通的TCP连接。
你说的connectionLost这个回调函数在你尝试发送数据时没有被调用,其实是错的。过了两分钟,底层的TCP连接会消失,Twisted会通过调用connectionLost来通知你。
如果你想更快地检测到这种情况,可以使用reactor.callLater来实现你自己的超时机制。