2010-04-23 121 views
2

我知道Twisted可以做到这一点,但简单的套接字呢?套接字丢失连接

你怎么知道你是否随机丢失了你在socket中的连接?比如说,如果我的互联网不得不退出并重新开始。

回答

0

如果互联网时时刻刻都来临,您可能实际上不会丢失TCP会话。如果你这样做,套接字API会抛出一些异常,通常是socket.timeout。

+1

我不认为它真的发出任何异常。它只是坐在那里,什么都不做。 – 2010-04-23 11:13:19

+0

啊是的,你必须调用'socket.settimeout()'。我不确定如何区分传输中的长时间停顿和实际中断。抱歉。 – 2010-04-23 11:23:59

1

我假设你正在谈论TCP。

如果您的网络连接暂时停止,您可能根本不会丢失TCP连接,它只会重新传输并恢复操作。

有100多条你可能会失去连接的其他原因(例如,一个NAT网关在无意间断开连接,另一端被核弹击中,你的路由器烧毁了,另一端的那个人猛拉他的网线,等等,等等)

这里是你应该做的,如果你需要检测死同行/关闭插座等:

  • 从插座或以任何其他方式等待阅读它上面的传入数据事件。这样可以检测连接是正常关闭还是发生错误(读取时返回0或-1) - 至少如果另一端仍然能够向主机发送TCP FIN/RST或ICMP数据包。

  • 写入插座 - 例如每N秒发送一次心跳。只要从套接字中读取,在另一端静静地失败时就不会检测到问题。如果该PC脱机,它显然可能不会告诉你它已经这么做 - 所以你必须发送一些东西,看看它是否响应。

  • 如果你不想每隔N秒写一次心跳,你至少可以打开TCP keepalive - 并且如果对方死了,你最终会收到通知。您仍然必须从套接字读取数据,并且通常每隔2小时发送一次Keepalive。尽管如此,这仍然比保持死亡插座好几个月。