套接字 - 仅在尝试发送后收到错误

时间:2013-08-01 05:54:22

标签: python sockets networking tcp connection

我有一个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()得到错误,有没有办法检测错误不试图发送数据?

1 个答案:

答案 0 :(得分:1)

根据连接的关闭方式,在尝试发送之前,您可能不知道它已关闭。默认情况下,TCP不会自动检测远程计算机是否在不发送断开连接的情况下消失。

您所看到的是正确的行为以及您需要处理的事情。但是,请确保您不假设来自recv的所有异常都是“崩溃”。我不知道python,但是你可能需要处理不同的异常(包括断开连接),但你发布的代码没有正确处理。

您应该启用TCP keepalive或发送应用程序层no-op数据包以确定您的连接是否仍处于打开状态。