Ver Mensaje Individual
  #6 (permalink)  
Antiguo 15/12/2012, 16:07
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: Duda de sockets en C

Hay dos formas de hacerlo, con multiples procesos o con forks.

Si quieres hacerlo con multiples procesos cada vez que aceptas un cliente generas una estructura de datos dinamicamente para ese cliente y abres un proceso con esos datos, el socket de servicio lo estaras reutilizando y el nuevo socket aceptado lo envias al proceso, de esta forma el socket cliente se manipulará desde el proceso y el socket de servicio solo estará bloqueado en el momento del accept. El proceso solo necesita el nuevo socket cliente para tramitar datos, de forma que el servidor queda libre. El proceso se encargará de ejecutar la peticion y liberar la memoria usada por la estructura de datos. Mientras estas procesando la peticion de un cliente puedes aceptar el siguiente y lanzar otro proceso paralelo, y asi con todos los clientes.

Si por el contrario quieres usar forks, la cosa depende de si estas en windows o en otro s.o.; los Berkeley sockets definen una funcion fork o select (o algo asi) que en windows se traduce a WSAAsyncSelect. Personalmente solo he usado sockets bajo windows, por lo que desconozco el funcionamiento en unix. Para el modelo asincrono de windows solo tienes que esperar que la aplicacion reciba unos determinados mensajes (FD_ACCEPT, FD_READ, FD_WRITE, etc) y responder de forma apropiada. Antes que nada deberas tener una lista donde guardaras los datos de los clientes; esta lista será de structs igual que con los multiprocesos, pero en vez de ejecutar las peticiones de forma simultanea, se ejecutaran segun el orden de mensaje que recibes (p.ej. recibes FD_WRITE con un indice de socket, buscas el socket en la lista y envias x bytes al cliente)

Creo que en algun sitio lei que el modelo multiproceso no es recomendable, pero no se. Seguramente encontraras algun manual por ahi, en la guia beej tienes un ejemplo de Synchronous I/O Multiplexing para Unix

Saludos
vosk