AliveFTP

por | 24 junio, 2015

Alguna vez les habrá pasado que se conectan a un servidor FTP y se les cierra la conexión por timeout. Esto probablemente es porque algún dispositivo de enrutamiento cerro la conexión por inactividad o porque el servidor esta detrás de un firewall que monitorea las conexiones y desecha las que llevan cierto tiempo inactivas para liberar recursos. Básicamente existen 3 formas de evitar esto.

TCP Keep Alive

La primera es que el servidor acepte TCP Keep Alive, que es una característica del protocolo TCP que permite saber si la red esta caída o el dispositivo remoto sigue conectado. Para lograr esto se envía un paquete sin datos al dispositivo remoto y, si el dispositivo no responde entonces se finaliza la conexión. Esto también nos sirve para mantener una conexión activa. El problema es que puede que el firewall este configurado para detectar el envío de estos paquetes por parte del cliente y cierre la conexión de todas maneras.

Si estan usando ftplib entonces solo tienen que configurar el socket del FTP de la siguiente manera:

ftp.sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

 

Consultas períodicas

Otra forma es enviar consultas periódicamente al FTP. Por ejemplo cada un minuto hacemos algo como esto:

ftp.voidcmd('NOOP')

 

Reiniciar la conexión

Operamos normalmente y si detectamos que se cayó la conexión nos volvemos a conectar. Para esto les voy a dejar un simple snippet que les soluciona ese problema. Se usa igual que ftplib por lo que pueden reemplazarlo directamente.

Enlace al snippet en GitHub AliveFTP

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *