Twisted未检测到客户端断开连接。

4

有人对这个有经验吗?我有一个Twisted应用程序。客户端连接到服务器。我添加了一个功能,如果一个客户端连接到服务器,但是已经有一个来自该IP地址的客户端在运行,则会断开新的客户端。

偶尔,我会关闭客户端计算机(或VM,准确地说),而不手动关闭Python程序。当我这样做时,很少但相当频繁地,服务器无法检测到任何断开连接。当计算机重新启动并尝试重新连接时,服务器坚持认为已经有来自该IP的连接。到目前为止,我找到的唯一解决方案是重新启动服务器。

可能是奇怪的网络问题导致断开连接没有完成吗?Twisted的bug?

我99%确定这不是处理断开连接的代码中的错误。我的代码设置了connectionLost,每当连接丢失时都会调用它,包括大多数关闭计算机的情况,它要么记录一个字符串说明什么被断开了,要么在发生奇怪的事情时抛出异常。这些事情都没有出现在日志中。


Twisted框架在所有概念层面(传输/连接、协议等)都定义了事件和事件处理程序来处理断开连接。因此,检查代码将有所帮助。您可以发布一个展示该行为的简化版本的代码。 - pyfunc
@pyfunc:我会深入研究代码。目前我怀疑是网络问题,因为我让客户端不断尝试重新连接,在某些情况下它最终能够连接成功(但在其他情况下则不能)。 - Claudiu
2个回答

5
这是一个Twisted FAQ,即使它与特定的Twisted没有任何关系。

2

嘿,我简直不敢相信我忘记了在网络课程中学到的所有知识...


(2:09:44 PM) coworker: this is the expected behaviour
(2:10:15 PM) coworker: the server has no way to know if someone dies, or is just quiet
(2:10:35 PM) coworker: unless ofcourse the server has some kind of ping/keepalive message
(2:15:38 PM) claudiu: ah so if they have no communicatin
(2:15:42 PM) claudiu: there's no way to tell that a TCP connection has died
(2:15:47 PM) claudiu: i remember learning that now, yes..
(2:16:23 PM) claudiu: but if i just make the server ping the client then it'll figure out soon enough from lack of ACKs that it's dead, right?
(2:16:45 PM) coworker: right

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接