如何确定连接何时断开?

时间:2012-12-13 15:33:15

标签: python exception exception-handling tcp

我正在使用以下TCP通信代码(服务器端)来处理超时等... 如果我杀死客户端软件而不是发生异常(socket.error),但是当我从客户端PC上拔下以太网线时,只发生socket.timeout异常,那么我怎么知道连接断开了?有可能我会在几分钟后得到socket.error例外吗?我尝试了3分钟,但我没有得到socket.error异常。

self.request.settimeout( 1 )
while 1:
        try:
            response = self.request.recv( buffSize )            
            if(response)
                ...response handler....       
            else:               
                ...disconnect handler....
        except socket.timeout :                  
            ...timeout handler...
        except socket.error:
            ...disconnect handler...

1 个答案:

答案 0 :(得分:2)

这取决于您想要检测断开连接的速度。如果您愿意等几分钟,可以打开TCP Keepalive(http://tools.ietf.org/html/rfc1122#page-101):

import socket
self.request.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

注意,TCP使用的实际时间间隔取决于操作系统。

如果您需要比TCP Keepalive提供的更快的东西,您可能需要在协议中引入“ping”功能。这意味着您的客户端和服务器定期交换一个空操作的消息。它只测试连接是否存在。