概述
简短回答: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中判断连接是否已断开所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复