我正在使用以下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...
答案 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”功能。这意味着您的客户端和服务器定期交换一个空操作的消息。它只测试连接是否存在。