Detectar conexion perdida con los sockets

Iniciado por Desiresportal, 30 Septiembre 2018, 14:07 PM

0 Miembros y 2 Visitantes están viendo este tema.

Desiresportal

Buenos dias.

Estoy tratando de hacer un programa para conectarse a internet y recibir los datos de una URL por medio de los sockets. Todo programado a lo "bestia". (Usando los sockets directamente sin librerias que me lo faciliten)

El caso es que haciendo pruebas me he dado cuenta que el programa tarda muchisimo en darse cuenta que la conexion se ha perdido. Supongo que eso es bueno para conexiones lentas. Para que la espera prolongada de una respuesta con una conexion lenta no sea sinonimo de desconexion. Pero yo quiero que no tarde tanto. Sobre todo cuando descargo una pagina web desde una URL cuyo header no indica el tamaño de lo que va a descargar.

¿Como detecto la desconexion del socket o la perdida de la conexion del equipo a internet?

Para las pruebas uso ubuntu, programo en C++, uso el comando "select()" para usar sockets no bloqueantes (este comando es totalmente nuevo para mi) y uso el movil para dar wifi al portatil. Para forzar la perdida de conexion del programa apago la zona wifi del movil. Aún no he logrado que esta forma de forzar la desconexion haga que mi programa deje de intentar seguir recibiendo datos. (Lo he dejado en bucle con "select()" y un contador durante mas de 10 minutos. No se ha bloqueado, pero tampoco ha detectado la perdida de la conexion.)

Un saludo y gracias de antemano.

Desiresportal

Acabo de programar una solucion al respecto. No es bonita, pero es mejor que no tener nada.


timeval lastCorrectRecv;
timeval currentTime;
unsigned int timeToLoseConnection;

/* Cuando se detecta que se han leido datos */
gettimeofday(&lastCorrectRecv, NULL);

/* En cada vuelta del bucle que comprueba "select()" */
gettimeofday(&currentTime, NULL);

/* Yo lo uso justo despues de la linea anterior */
if (currentTime.tv_sec - lastCorrectRecv.tv_sec > timeToLoseConnection) {
     // Conexion supuestamente perdida.
}


Por supuesto, tambien hago las comprobaciones de que "select()" confirme la desconexion del socket para no tener que esperar los 120 segundos (2 minutos) que pongo como margen por defecto.

De todos modos. Sigo a la espera de una forma mas limpia y rapida de detectarlo.


PD: Si me he equivocado en algun caracter al escribir, lo siento. Estoy haciendo esto con prisas y con el movil, de modo que se me puede haber colado algo.