Problema con sockets

Iniciado por <<<-Basura->>>, 11 Abril 2013, 21:54 PM

0 Miembros y 1 Visitante están viendo este tema.

<<<-Basura->>>

Buenas estoy trabajando con sockets y he dado con un problema...

Mi servidor acepta n cantidad de clientes y los agrega a una lista, y controla todos los clientes con hilos respectivamente.

El problema esta cuando un cliente se desconecta sin avisar... esto provoca que se caiga el servidor: "(program exited with code: 141)"...

Lo que quiero saber es como puedo saber si un cliente se desconecta de forma inesperada??
Como puedo controlarlo?
<<<--Basura-->>>

Luz Violeta

http://www.etnassoft.com/biblioteca/guia-beej-de-programacion-en-redes/

En una lectura básica de sockets está lo que buscás, toca repasar (pista → una práctica que tiene que ser ritual es revisar siempre los valores de retorno de una función, por que funcione en nuestro entorno no significa que donde la ejecutemos vaya a funcionar )

Saludos.
It's sort of like my past is an unfinished painting. And as the artist of that painting, I must fill in all the ugly holes and make it beautiful again.

0xDani

Eso me paso a mi, y creo recordar que era porque tu programa habia recibido la señal SIGPIPE, que significa que un socket se ha desconectado, y al escribir o recibir desde uno de estos sockets, y si no tienes un handler, crashea el programa.

Prueba esto:

Código (bash) [Seleccionar]
strace ./tu_programa

Y pon el output, o si es muy largo la parte en la que crashea.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

<<<-Basura->>>

0xDani, hice que mi programa capturara la señal SIGPIPE, y la captura pero no se como hacer para saber cual fue exactamente el socket que tubo el problema, me entiendes??

Si captura la señal, pero no se cual fue el socket que la producío
<<<--Basura-->>>

0xDani

Te digo lo que hice en mi flooder:

Antes de intentar escribir o leer del socket, usaba la funcion getpeername(), y si retornaba un valor indicando que había fallado, cerraba y volvía a conectar el socket.

De todas formas ahí esta el código, mírate la función t (la que le paso al thread), justo antes de que haga la petición.

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM