При каждой отправке пакетов обновлять переменную
lastpacket = time.time() # дата крайней отправки пакета
Далее в нужный момент делаем проверку
if time.time() - lastpacket > 30: # отправки не было более 30 сек.
self.log('connection timed out') # значит соединение можно считать разорванным
Параллельно с этим(в отдельном потоке) каждые, например, 10 секунд отправляем Keep Alive:
try:
sock.send("\x05") # отправляем любые данные
except:
self.log('connection timed out') # соединение разорвано
time.sleep(10)
Рабочее решение.
Если есть решение лучше - скажите об этом.