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不是您的意思。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值