我有一个TCP服务器,代码看起来像这样(在循环中):
r, w, e = select([self.sock], [self.sock], [self.sock], 0)
if r or e:
try:
data = self.sock.recv(2048)
except:
debug("%s: .recv() crashed!"%self.id)
debug(traceback.format_exc())
break
由于某种原因,我从客户端到这个服务器的连接随机断开,但我只是看到它在我尝试发送数据后就崩溃了,然后我从recv()得到错误,有没有办法检测错误不试图发送数据?
答案 0 :(得分:1)
根据连接的关闭方式,在尝试发送之前,您可能不知道它已关闭。默认情况下,TCP不会自动检测远程计算机是否在不发送断开连接的情况下消失。
您所看到的是正确的行为以及您需要处理的事情。但是,请确保您不假设来自recv的所有异常都是“崩溃”。我不知道python,但是你可能需要处理不同的异常(包括断开连接),但你发布的代码没有正确处理。
您应该启用TCP keepalive或发送应用程序层no-op数据包以确定您的连接是否仍处于打开状态。