elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Accede Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Por que motivos se cierra un programa con sockets hecho en C?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Por que motivos se cierra un programa con sockets hecho en C?  (Leído 743 veces)
AlbertoBSD
Programador y
Colaborador
***
Desconectado Desconectado

Mensajes: 3.465


🏴 Libertad!!!!!


Ver Perfil WWW
Por que motivos se cierra un programa con sockets hecho en C?
« en: 31 Julio 2020, 01:30 »

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:

  • llamaa explicita a exit o variantes
  • bufferoverflow y variantes de segment fault
  • NULL pointer... (parecido al anterior)
  • No poder asignar mas memoria
  • No poder crear mas threads

Algunos son salidas explícitamente programadas y otras son por bugs.

Tengo un proyecto en C, es un servidor WEB multihilo:

https://github.com/albertobsd/chttpserv

De momento funciona bien cuando hago peticiones mediante  curl incluso soporta un ciclo sin fin de peticiones:

Código
  1. while true; do curl -i http://localhost:3002/ ; done

Sin embargo cuando le hago las peticiones desde cualquier otro navegador que procese todos los archivos y CIERRO el navegador a media carga el programa simplemente se sale sin mensaje de error.

OJO que solo es cuando cierro a media carga, si espero a que termine de cargar la pagina por completo esto no sucede.

Consideraciones:
  • Estoy totalmente seguro de que la mayoría de las funciones que pueden dar error están correctamente procesadas y muestran el error correspondiente:
Código
  1. s = pthread_create(&tid,&attr,thread_process,(void *)tothread);
  2. if(s != 0) {
  3. perror("pthread_create");
  4. }
  5.  

  • Todas las funciones de lectura y escritura en el socket se valida si leyeron o escribieron los datos y no devolvio error:
Código
  1. while(sended >= 0  && readed >= 0 && !feof(fd)  ) {
  2. readed = fread(buffer,1,128,fd);
  3. if(readed > 0)
  4. sended = send(hsc->client_fd,buffer,readed,0);
  5. }
  6. if(sended ==  -1) {
  7. perror("send");
  8. }
  9. if(readed == -1) {
  10. perror("fread");
  11. }
  12.  

  • También estoy seguro que no es un problema de memoria ya que tengo una libreria propia con la que me he asegurado tras varias pruebas de que todos los apuntadores asignados con malloc/calloc son liberados y no se vuelven a utilizar, ademas de indicarme la cantidad de memoria dinamica actualmente utilizada.
  • De igual manera todos los sockets son cerrados mediante:
Código
  1. shutdown(hsc->client_fd,SHUT_RDWR);
  2. close(hsc->client_fd);

Se que el problema tiene que ver con Sockets ya que solo cuando cierro el navegador a media carga el programa termina.

Me he quedado un poco estancado, ya que siento que no avanzo si no soluciono ese error.

No les pido que depuren mi codigo, ya que no esta 100% documentado.

Pregunto: ¿Alguien a tenido el mismo problema?, ¿Que otros motivos hacen que el programa se cierre y no caiga error en ninguna función?

Saludos


« Última modificación: 3 Agosto 2020, 16:58 por AlbertoBSD » En línea

@XSStringManolo
Colaborador
***
Desconectado Desconectado

Mensajes: 2.029


Turn off the red ligth


Ver Perfil WWW
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #1 en: 31 Julio 2020, 02:40 »

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
  1. <textarea id="code"></textarea>
  2. <br />
  3. <textarea id="resp"></textarea>
  4. <br />
  5. <button id="add" type="button">add</button>
  6. ...
  7.  
  8.  
  9. $("#add").onClick = function() {
  10.  var code = $("#code").value, tmp = "";
  11.  for (var i = 0; i < code.length; ++i) {
  12.     tmp += code.replace("\n", '\nprintf("Line number ' + i + '); printf("\n");');
  13.  }
  14.  $("#resp").value = tmp;
  15. };


En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.620


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #2 en: 31 Julio 2020, 09:10 »

No 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 ...
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
AlbertoBSD
Programador y
Colaborador
***
Desconectado Desconectado

Mensajes: 3.465


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #3 en: 3 Agosto 2020, 15:53 »

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:

Código:
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:

Código
  1. if((clientfd = accept(servfd,(struct sockaddr *)socketserver,(socklen_t*) &b)) < 0) {
  2. perror("accept");
  3. exit(5);
  4. }

¿A alguien le a pasado?

Saludos!
En línea

Eternal Idol
Moderador
***
Desconectado Desconectado

Mensajes: 5.620


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #4 en: 3 Agosto 2020, 16:04 »

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
En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
AlbertoBSD
Programador y
Colaborador
***
Desconectado Desconectado

Mensajes: 3.465


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #5 en: 3 Agosto 2020, 16:37 »

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

Código
  1. #include<signal.h>

Y una llamada a la función

Código
  1. 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!
« Última modificación: 3 Agosto 2020, 16:57 por AlbertoBSD » En línea

kub0x
Enlightenment Seeker
Colaborador
***
Desconectado Desconectado

Mensajes: 1.345


S3C M4NI4C


Ver Perfil
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #6 en: 3 Agosto 2020, 19:16 »

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.
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

AlbertoBSD
Programador y
Colaborador
***
Desconectado Desconectado

Mensajes: 3.465


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Por que motivos se cierra un programa con sockets hecho en C?
« Respuesta #7 en: 3 Agosto 2020, 19:23 »

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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con un programa hecho con winsock
Programación Visual Basic
hacker2000 1 2,242 Último mensaje 12 Mayo 2005, 19:42
por soplo
Conexion Sql Express con programa hecho en C#
.NET (C#, VB.NET, ASP)
lince_0011 6 6,131 Último mensaje 10 Diciembre 2009, 01:27
por [D4N93R]
Mensajero 1.0 [Programa Hecho Por Mi]
.NET (C#, VB.NET, ASP)
NESTicle 8Bit 5 3,614 Último mensaje 11 Septiembre 2011, 22:07
por Keyen Night
Programa no cierra
Programación C/C++
andoporto 1 715 Último mensaje 7 Febrero 2015, 19:57
por engel lex
Programa hecho en phyton .py
Scripting
Rnovatis 2 1,429 Último mensaje 28 Mayo 2017, 02:36
por LaThortilla (Effort)
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines