Socket 连接丢失

2 投票
2 回答
1710 浏览
提问于 2025-04-15 21:56

我知道Twisted可以很好地处理这个问题,但如果只是用普通的socket呢?

你怎么判断在使用socket的时候,连接突然断开了呢?比如说,如果我的网络突然断了,然后又恢复了。

2 个回答

0

如果互联网偶尔断断续续,你可能并不会真的失去TCP连接。如果真的失去了,socket API会抛出一种异常,通常是socket.timeout。

1

我猜你是在说TCP连接。

如果你的网络连接中断了一秒钟,你可能根本不会失去TCP连接,它会自动重传并继续工作。

当然,还有很多其他原因可能导致连接中断(比如中间的NAT网关默默地断开了连接,另一端遭遇了意外,或者你的路由器坏了,甚至对方直接拔掉了网线等等)。

如果你需要检测失效的连接或关闭的套接字,可以按照以下步骤操作:

  • 从套接字读取数据,或者以其他方式等待它的输入数据。这可以帮助你发现连接是否正常关闭,或者是否发生了错误(如果读取返回0或-1)——前提是对方仍然能发送TCP的FIN/RST包或ICMP包给你。

  • 向套接字写入数据——例如,每隔N秒发送一些心跳信号。仅仅从套接字读取数据并不能在对方静默失败时发现问题。如果那台电脑下线了,它显然无法告诉你,所以你需要发送一些东西看看它是否有回应。

  • 如果你不想每N秒都发送心跳信号,至少可以开启TCP的保活功能——这样如果对方失效,你最终会收到通知。不过你仍然需要从套接字读取数据,保活信号通常默认每两小时发送一次。尽管如此,这总比让失效的套接字存在几个月要好。

撰写回答