0

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

4

1 回答 1

1

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

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

您应该启用 TCP keepalive 或发送应用层无操作数据包以确定您的连接是否仍然打开。

于 2013-08-01T06:16:17.197 回答