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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Creando una libreria sockets en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Creando una libreria sockets en C  (Leído 2,173 veces)
xanxito

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Creando una libreria sockets en C
« en: 30 Marzo 2015, 20:16 pm »

Hola, estoy desarrollando un proyecto de cooperación (sistema corrector de programas informaticos) y estoy un poco perdido con mi liberia en C para la comunicación mediante sockets.

Hasta el momento he creado una libreria para comunicar distintos procesos y que entre ellos se manden mensajes y archivos de texto.

Esta parte funciona correctamente.

EL PROBLEMA:

No he conseguido cerrar/matar uno de los processos que recibe el codigo (un archivo .c o .cpp) sin que el sistema se cuelgue.

Tengo un processo llamado manager que controla y gestiona todo los processos worker encargados de recibir, compilar y ejecutar codigos C o C++.

Este es el codigo de la parte que crea la connexion de la libreria.

Si alguien tiene conocimientos de sockets en C agradeceria mucho la ayuda. Si haec falta puedo facilitar-le el codigo de las distintas partes que usan sockets. Muchas gracias.

El proyecto sera libre en codigo abierto.

Código
  1. /*
  2. * Se le pasa un socket de servidor y acepta en el una conexion de cliente.
  3. * devuelve el descriptor del socket del cliente o -1 si hay problemas.
  4. * Esta funcion vale para socket AF_INET o AF_UNIX.
  5. */
  6. int Servidor_Acepta_Conexion_Del_Cliente (int Descriptor)
  7. {
  8. socklen_t Longitud_Cliente;
  9. struct sockaddr Cliente;
  10. int Hijo;
  11.  
  12. /*
  13. * La llamada a la funcion accept requiere que el parametro
  14. * Longitud_Cliente contenga inicialmente el tamano de la
  15. * estructura Cliente que se le pase. A la vuelta de la
  16. * funcion, esta variable contiene la longitud de la informacion
  17. * util devuelta en Cliente
  18. */
  19. Longitud_Cliente = sizeof (Cliente);
  20. Hijo = accept (Descriptor, &Cliente, &Longitud_Cliente);
  21. if (Hijo == -1)
  22. return -1;
  23.  
  24. /*
  25. * Se devuelve el descriptor en el que esta "enchufado" el cliente.
  26. */
  27. return Hijo;
  28. }
  29.  
  30. /*
  31. * Abre un socket servidor de tipo AF_INET. Devuelve el descriptor
  32. * del socket o -1 si hay probleamas
  33. * Se pasa como parametro el nombre del servicio. Debe estar dado
  34. * de alta en el fichero /etc/services
  35. */
  36. int Servidor_Abre_Socket_Inet (char *Servicio, int longitudColaEspera)
  37. {
  38. struct sockaddr_in Direccion;
  39. struct sockaddr Cliente;
  40. socklen_t Longitud_Cliente;
  41. struct servent *Puerto;
  42. int Descriptor;
  43.  
  44. /*
  45. * se abre el socket
  46. */
  47. Descriptor = socket (AF_INET, SOCK_STREAM, 0);
  48. if (Descriptor == -1)
  49. return -1;
  50.  
  51. /*
  52. * Se obtiene el servicio del fichero /etc/services
  53. */
  54. Puerto = getservbyname (Servicio, "tcp");
  55. if (Puerto == NULL)
  56. return -1;
  57.  
  58. /*
  59. * Se rellenan los campos de la estructura Direccion, necesaria
  60. * para la llamada a la funcion bind()
  61. */
  62. Direccion.sin_family = AF_INET;
  63. Direccion.sin_port = htons(Puerto->s_port);
  64. Direccion.sin_addr.s_addr = htonl(INADDR_ANY);
  65. //Direccion.sin_port = (Puerto->s_port);
  66. //Direccion.sin_addr.s_addr = (INADDR_ANY);
  67. if (bind (
  68. Descriptor,
  69. (struct sockaddr *)&Direccion,
  70. sizeof (Direccion)) == -1)
  71. {
  72. close (Descriptor);
  73. return -1;
  74. }
  75.  
  76. /*
  77. * Se avisa al sistema que comience a atender llamadas de clientes
  78. */
  79. if (listen (Descriptor, longitudColaEspera) == -1)
  80. {
  81. close (Descriptor);
  82. return -1;
  83. }
  84.  
  85. /*
  86. * Se devuelve el descriptor del socket servidor
  87. */
  88. return Descriptor;
  89. }
  90.  
  91. /*
  92. / Conecta con un servidor remoto a traves de socket INET
  93. */
  94. int Cliente_Abre_Conexion_Inet (char *Host_Servidor, char *Servicio)
  95. {
  96. struct sockaddr_in Direccion;
  97. struct servent *Puerto;
  98. struct hostent *Host;
  99. int Descriptor;
  100.  
  101. Puerto = getservbyname (Servicio, "tcp");
  102. if (Puerto == NULL)
  103. return -1;
  104.  
  105. Host = gethostbyname (Host_Servidor);
  106. if (Host == NULL)
  107. return -1;
  108.  
  109. Direccion.sin_family = AF_INET;
  110. Direccion.sin_addr.s_addr = ((struct in_addr *)(Host->h_addr))->s_addr;
  111. Direccion.sin_port = htons(Puerto->s_port);
  112. //Direccion.sin_port = (Puerto->s_port);
  113.  
  114. Descriptor = socket (AF_INET, SOCK_STREAM, 0);
  115. if (Descriptor == -1)
  116. return -1;
  117.  
  118. if (connect (
  119. Descriptor,
  120. (struct sockaddr *)&Direccion,
  121. sizeof (Direccion)) == -1)
  122. {
  123. return -1;
  124. }
  125.  
  126. return Descriptor;
  127. }
  128.  

Si mato uno de los procesos worker el gestor se cuelga devido a la connexión.

Mod: prohibido hacer doble post... tema modificado con etiquetas GeSHi para hacerlo más visible


« Última modificación: 30 Marzo 2015, 20:20 pm por engel lex » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mejor libreria de sockets
Programación C/C++
_katze_ 1 1,733 Último mensaje 11 Febrero 2013, 16:19 pm
por 0xDani
Duda creando un menu usando la libreria SDL
Programación C/C++
erest0r 0 1,405 Último mensaje 30 Agosto 2013, 00:40 am
por erest0r
Donde puedo encontrar la libreria y librerias necesarias para Sockets?
Programación C/C++
madrilillo 1 2,241 Último mensaje 27 Octubre 2013, 19:27 pm
por vangodp
[Idea] Librería para simplificar el uso de sockets
Programación C/C++
Miky Gonzalez 2 2,154 Último mensaje 19 Noviembre 2014, 21:50 pm
por Miky Gonzalez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines