Servidor <=> Cliente - Comunicación entre procesos hij

Temas relacionados con la programación de aplicaciones que funcionan sobre un servidor.
Responder
Mensaje
Autor
serpens11
Mensajes: 3
Registrado: 25/06/2011 9:21 am

Servidor <=> Cliente - Comunicación entre procesos hij

#1 Mensaje por serpens11 » 25/06/2011 9:27 am

Buenas compañeros!

quería preguntar una duda sobre como realizar una comunicación, ya que lo he estado intentando y no lo he conseguido. La descripción del programa es la siguiente:

Un servidor, que cuando recibe un socket levanta un proceso hijo. De tal manera, que por cada cliente que se conecta al servidor, tengo un proceso hijo diferente.

Mi duda está, en que una de las comunicaciones que tengo que hacer, es de un hijo directamente a otro hijo. Cuando se me planteó el problema, lo primero que pensé fue en usar memoria compartida. Para ello me cree una estructura que me guarda el socket que crea en el main cuando recibe la conexión. Entonces, en teoría como tengo el socket del otro hijo, leer este y luego hacer un write sobre este en un hijo, y me escribirá en el socket del otro hijo.

Este planteamiento es correcto?? Por que lo he realizado, y me escribe en el mismo hijo, y no el otro.

Si el planteamiento es correcto, avisarme entonces os enseño un poco el código para ver si es que he coodeado mal. Si el planteamiento es incorrecto, como podría cumplir este requisito?

Gracias!!!

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#2 Mensaje por polly » 25/06/2011 2:08 pm

Lo que te piden es implementar un servidor multihilo:

1.- El proceso servidor está a la escucha de conexiones.
2.- Cuando un proceso cliente realiza una petición al servidor, éste le atiende creando un nuevo proceso hijo (o hilo), de tal forma que el cliente solo se comunica con el hijo.
3.- Volver a 1


S2
enrmarc

serpens11
Mensajes: 3
Registrado: 25/06/2011 9:21 am

#3 Mensaje por serpens11 » 25/06/2011 3:05 pm

No sé si me he explicado mal, pero eso es lo que YA tengo implementado. El problema es como realizas la comunicación entre dos hijos o hilos, ya que un cliente tiene que se capaz de enviar una trama a otro cliente.

Avatar de Usuario
eagleoneraptor
Mensajes: 187
Registrado: 20/05/2008 10:24 am
Ubicación: Buenos Aires(Argentina)

#4 Mensaje por eagleoneraptor » 25/06/2011 4:32 pm

Mmmm... o sea, ¿los procesos hijos deben escuchar conexiones también?
"Aquel que hace una bestia de si mismo se libra del dolor de ser un hombre". Dr. Johnson

serpens11
Mensajes: 3
Registrado: 25/06/2011 9:21 am

#5 Mensaje por serpens11 » 25/06/2011 5:10 pm

Por lo que veo me explico fatal jeje

Los hijos no tienen que escuchar conexiones. Pongo un ejemplo:

El usuario A se conecta el servidor. => En realidad lo que sucede, es que el padre acepta la conexion y crea un hijo con el cual se comunicara el cliente.

El usuario B se conecta al servidor => Ahora mismo hay 2 usuarios conectados al servidor. Aqui se repite otra vez el proceso de A, es decir, el padre recibe la conexión y crea otro proceso hijo con el cual se comunicará el cliente B.

El problema está, en que en estos momentos hay 2 procesos hijos para cada cliente, y uno de los requisitos que tengo que implementar, es que el cliente B pueda enviar un mensaje al cliente A. Para realizar esto, de alguna manera necesito el socket (file descriptor) del cliente A, para hacer un write(fdClienteA,"mensaje", 7); Aunque, de hecho no estoy seguro si se puede hacer esto, por eso os pregunto, si se puede y como. Yo lo he intentando con memoria compartida, en el padre guardo los file descriptor en memoria compartida para poder acceder desde cualquier hijo, pero no funciona. De hecho, he hecho un printf de los filedescriptors y en todos los clientes, en el padre me devuelve el valor 4.

Si teneis ideas serán bien recibidas, sino mañana creo que lo implementaré con pipes, que eso seguro que funciona.

Saludos y gracias

Avatar de Usuario
eagleoneraptor
Mensajes: 187
Registrado: 20/05/2008 10:24 am
Ubicación: Buenos Aires(Argentina)

#6 Mensaje por eagleoneraptor » 25/06/2011 10:13 pm

Lamentablemente tengo muy poca experiencia con la comunicación entre procesos (IPC), que según entiendo ahora, es lo que querés lograr. Pero te intentaré ayudar con lo que pueda :) .

Lo que he encontrado acerca del tema está acá: http://www.cs.cf.ac.uk/Dave/C/CE.html

Si te fijas mas o menos por la mitad del índice de contenidos hablan de una serie de técnicas para la IPC, quizás podrías probar una cola de mensajes con las funciones de POSIX: mq_open, mq_send, etc.
O quizás usar la memoria compartida (shm_open, shm_unlink) de otra manera... crearla en uno de los hijos, y que otro hijo pueda abrirla.
En fin... mejor lo dejo a tu criterio que al no entender mucho de IPC seguro estoy escribiendo de mas jeje.

Fíjate de revisar las páginas del manual de las funciones que indican en el sitio web que te mencioné... no lo desarrollan muy bien.

Espero que te haya ayudado en algo :D !
Uŋ Sałudø!
"Aquel que hace una bestia de si mismo se libra del dolor de ser un hombre". Dr. Johnson

polly
Mensajes: 619
Registrado: 19/07/2007 3:42 pm
Ubicación: Valladolid (Spain)
Contactar:

#7 Mensaje por polly » 27/06/2011 3:39 am

Yo creo que no hace falta que los clientes se comuniquen directamente entre si. Por ejemplo el cliente A quiere enviarle un mensaje al cliente B, entonces primero manda el mensaje al servidor y este se lo reenvia a B. De esta manera los clientes permanecen desacoplados.

La comunicacion entre A y el servidor y entre el servidor y B es la habitual con write y read.

S2
enrmarc

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado