我是靠谱客的博主 受伤铃铛,最近开发中收集的这篇文章主要介绍python如何判断tcp异常断开_如何在python中判断连接是否已断开,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简短回答:use a non-blocking recv(), or a blocking recv() / select() with a very

short timeout.

长答案:

处理套接字连接的方法是根据需要读或写,并准备好处理连接错误。

TCP区分了“丢弃”连接的三种形式:超时、重置、关闭。

其中,无法真正检测到超时,TCP可能只告诉您时间尚未过期。但即使它告诉你了,时间也可能在不久之后就结束了。

还要记住,使用shutdown()您或您的对等方(连接的另一端)可能只关闭传入字节流,并保持传出字节流运行,或者关闭传出字节流并保持传入字节流运行。

所以严格地说,您需要检查读流是否关闭,写流是否关闭,或者两者是否都关闭。

即使连接被“断开”,您仍应该能够读取仍在网络缓冲区中的任何数据。只有当缓冲区为空时,才会收到与recv()的断开连接。

检查连接是否已断开就像询问“读取当前缓冲的所有数据后,我将收到什么?”为了找到答案,您只需要读取当前缓冲的所有数据。

我可以看到“读取所有缓冲数据”以结束它,对某些人来说可能是个问题,他们仍然认为recv()是一个阻塞函数。使用blocking recv(),当缓冲区已经为空时,“检查”读操作将被阻塞,这将破坏“检查”的目的。

在我看来,任何被记录为可能无限期地阻止整个过程的函数都是一个设计缺陷,但我猜它仍然存在,因为历史原因,从使用套接字开始,就像使用常规文件描述符是一个很酷的主意。

你能做的是:将套接字设置为非阻塞模式,但会出现一个系统相关错误,指示接收缓冲区为空或发送缓冲区已满

保持阻塞模式,但设置一个很短的套接字超时。这将允许您使用recv()来“ping”或“check”套接字,这几乎是您想要做的

使用select()调用或asyncore模块,超时时间非常短。错误报告仍然是系统特定的。

对于问题的写部分,保持读缓冲区为空几乎可以解决这个问题。在非阻塞读取尝试后,您将发现连接“断开”,并且您可以选择在读取返回关闭的通道后停止发送任何内容。

我想唯一能确保你发送的数据已经到达另一端的方法是:在同一个套接字上接收正确的响应,以获得您发送的确切消息。基本上,您是使用更高级别的协议来提供确认。

对套接字执行成功的shutdow()和close()

python套接字howto说,如果通道关闭,send()将返回0字节。可以使用非阻塞套接字或超时套接字。send()如果它返回0,则不能再在该套接字上发送数据。但如果它返回非零,您已经发送了一些内容,祝您好运:)

在这里,我没有把OOB(带外)socket数据看作是解决您问题的一种方法,但我认为OOB不是您的意思。

最后

以上就是受伤铃铛为你收集整理的python如何判断tcp异常断开_如何在python中判断连接是否已断开的全部内容,希望文章能够帮你解决python如何判断tcp异常断开_如何在python中判断连接是否已断开所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部