0

我正在使用以下 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...
4

1 回答 1

2

这取决于您希望以多快的速度检测到断开的连接。如果你愿意等几分钟,你可以开启 TCP Keepalive ( https://www.rfc-editor.org/rfc/rfc1122#page-101 ):

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

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

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

于 2012-12-13T15:55:27.660 回答