我知道Twisted可以做得很好,但只是简单的套接字呢?
你怎么知道你是否随机丢失了socket中的连接?就像,如果我的互联网不久就会出现并重新开始。
答案 0 :(得分:1)
我假设你在谈论TCP。
如果您的互联网连接暂停一段时间,您可能根本不会丢失TCP连接,它只会重新传输并恢复运行。
有100个其他原因你可能会失去连接(例如,中间的NAT网关决定默默地丢弃连接。另一端被核武器击中。你的路由器烧毁。另一端的人猛拉了他的网络电缆等等。)
如果你需要检测死对等/封闭套接字等,你应该怎么做:
从套接字读取或以任何其他方式等待传入数据的事件。这允许您检测连接正常关闭的时间,或者在其上发生错误(读取它返回0或-1) - 至少如果另一端仍然能够向您的主机发送TCP FIN / RST或ICMP数据包
写入套接字 - 例如每N秒发送一些心跳。当另一端无声地失败时,只需从套接字读取就不会检测到问题。如果该PC脱机,它显然不能告诉你它已经发生了 - 所以你必须发送一些东西,看看它是否响应。
如果您不想每N秒写一次心跳,您至少可以启用TCP keepalive - 如果对等方已经死亡,您最终会收到通知。您仍然必须从套接字读取,并且默认情况下通常每2小时发送一次keepalive。这仍然比保持死插座好几个月好。
答案 1 :(得分:0)
如果互联网暂时出现,您实际上可能不会丢失TCP会话。如果这样做,套接字API将抛出某种异常,通常是socket.timeout。