Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: <<<-Basura->>> en 11 Abril 2013, 21:54 pm



Título: Problema con sockets
Publicado por: <<<-Basura->>> en 11 Abril 2013, 21:54 pm
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?


Título: Re: Problema con sockets
Publicado por: Luz Violeta en 12 Abril 2013, 21:30 pm
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.


Título: Re: Problema con sockets
Publicado por: 0xDani en 12 Abril 2013, 21:54 pm
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
  1. strace ./tu_programa

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

Saludos.


Título: Re: Problema con sockets
Publicado por: <<<-Basura->>> en 22 Abril 2013, 02:36 am
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


Título: Re: Problema con sockets
Publicado por: 0xDani en 22 Abril 2013, 15:20 pm
Te digo lo que hice en mi flooder (https://foro.elhacker.net/programacion_cc/aporte_flooder_http-t374640.0.html;msg1796074#msg1796074):

Antes de intentar escribir o leer del socket, usaba la funcion getpeername() (http://pubs.opengroup.org/onlinepubs/009695399/functions/getpeername.html), 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.