Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 31 Julio 2020, 01:30 AM

Título: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: AlbertoBSD en 31 Julio 2020, 01:30 AM
Muy buenos días compañeros.

Por algun momento pense en colar el titulo de "ayuda mi programa se cierra sin motivo", pero no es demasiado genérico y solo un novato lo haría

Quiero explorar los diversos motivos por los que un programa en C se cierra. De momento vienen a mi mente los siguientes motivos:

Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: @XSStringManolo en 31 Julio 2020, 02:40 AM
Un printf con un número por linea y ya ves en que linea peta.

Puedes hacer un script en js para que te añada los printf.

Algo tipo:

Código (javascript) [Seleccionar]
<textarea id="code"></textarea>
<br />
<textarea id="resp"></textarea>
<br />
<button id="add" type="button">add</button>
...


$("#add").onClick = function() {
 var code = $("#code").value, tmp = "";
 for (var i = 0; i < code.length; ++i) {
    tmp += code.replace("\n", '\nprintf("Line number ' + i + '); printf("\n");');
 }
 $("#resp").value = tmp;
};

Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: Eternal Idol en 31 Julio 2020, 09:10 AM
Cita de: AlbertoBSD en 31 Julio 2020, 01:30 AMNo les pido que depuren mi codigo, ya que no esta 100% documentado.

Eso es justamente lo que tenes que hacer. ¿Lo ejecutaste bajo un depurador? Y en una ejecucion normal deberia crear algun tipo de volcado de memoria ...
Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: AlbertoBSD en 3 Agosto 2020, 15:53 PM
Cita de: Eternal Idol en 31 Julio 2020, 09:10 AM
Y en una ejecucion normal deberia crear algun tipo de volcado de memoria ...

Gracias por responder, he intentado habilitar que genere algún DUMP file pero no lo hace, revisando las opciones disponibles, utilice strace, reproduciendo el error con esta herramienta la ultima linea que veo es:

accept(3,  <unfinished ...>)            = ?
+++ killed by SIGPIPE +++


Como comento el error se reproduce cuando te conectas con el navegador y cierras de inmediato. He depurado mi código desde el dia que hice el post y no encuentro ningún fallo en el mismo.

Según la salida de strace parece ser un error en la función accept, al momento de cerrar cerrar el navegador alguna de las conexiones entrantes al servidor es cancelada por el cliente y se produce el fallo, no entiendo que este pasando, por queen caso de accept me deberia de devolver error y no lo hace:

if((clientfd = accept(servfd,(struct sockaddr *)socketserver,(socklen_t*) &b)) < 0) {
perror("accept");
exit(5);
}


¿A alguien le a pasado?

Saludos!
Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: Eternal Idol en 3 Agosto 2020, 16:04 PM
No trabajo en *NIX asi que nunca me paso, parece ir por aca la cosa:
https://stackoverflow.com/questions/18935446/program-received-signal-sigpipe-broken-pipe
https://stackoverflow.com/questions/108183/how-to-prevent-sigpipes-or-handle-them-properly
Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: AlbertoBSD en 3 Agosto 2020, 16:37 PM
Muchas gracias, tambien busque un poco sobre el error, parece ser mas un error de write que de connect tendré que revisar como manejarlo. Ya con esto me doy una mejor idea de que pude estar pasando.

Tema solucionado  ;-)

Solo falta agregar agregar el header a signal, esto dentro de linux


#include<signal.h>


Y una llamada a la función

signal(SIGPIPE, SIG_IGN);

Con esto el programa ignora la señal SIGPIPE, sin embargo hay que procesar correctamente los posibles errores a cualquier función send, write, recv, read sobre los sockets.

Saludos!
Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: kub0x en 3 Agosto 2020, 19:16 PM
Por lo que entiendo del tema, como dicen en SO, al cerrar el socket desde el otro extremo e intentar escribir en el mismo, recibes la señal SIGPIPE. Por lo tanto, el comportamiento default es cerrar la aplicación, sin que la ejecucción pase al bloque donde controlas el error. ¿Es así? Entonces override a la señal y handlear errores.

Siempre se aprende algo nuevo de los post de debugging.

Saludos.
Título: Re: Por que motivos se cierra un programa con sockets hecho en C?
Publicado por: AlbertoBSD en 3 Agosto 2020, 19:23 PM
Cita de: kub0x en  3 Agosto 2020, 19:16 PM
handlear errores.

Si, el detalle es que ya los procesaba, pero por alguna razón el default del SO era cerrar la aplicación por motivo de SIGPIPE, pero una vez ignoranda la señal el programa funcionó perfectamente.

Saludos