/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

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

 
      Índice del Foro elrincondelc.com -> Programación en Servidores
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
serpens11



Registrado: 25 Jun 2011
Mensajes: 3

MensajePublicado: 25/06/2011 9:27 am
Título: Servidor <=> Cliente - Comunicación entre procesos hij

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!!!
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 25/06/2011 2:08 pm
Título:

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
Volver arriba
serpens11



Registrado: 25 Jun 2011
Mensajes: 3

MensajePublicado: 25/06/2011 3:05 pm
Título:

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.
Volver arriba
eagleoneraptor



Registrado: 20 May 2008
Mensajes: 187
Ubicación: Buenos Aires(Argentina)

MensajePublicado: 25/06/2011 4:32 pm
Título:

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
Volver arriba
serpens11



Registrado: 25 Jun 2011
Mensajes: 3

MensajePublicado: 25/06/2011 5:10 pm
Título:

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
Volver arriba
eagleoneraptor



Registrado: 20 May 2008
Mensajes: 187
Ubicación: Buenos Aires(Argentina)

MensajePublicado: 25/06/2011 10:13 pm
Título:

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 Smile .

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 Very Happy !
Un Saludø!
_________________
"Aquel que hace una bestia de si mismo se libra del dolor de ser un hombre". Dr. Johnson
Volver arriba
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 27/06/2011 3:39 am
Título:

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
Volver arriba
      Índice del Foro elrincondelc.com -> Programación en Servidores
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com