el Dr Katz escribió:Buenas,
Estoy intentando crear un servidor en C usando el protocolo UDP con múltiples clientes, el problemilla me viene a la hora de querer atender varias peticiones a la vez. Tal como lo tengo ahora, me van llegando peticiones y voy procesandolas una a una, añadiéndose a la cola de espera, esto no es problema si tardo poco en procesar los datos. Usando TCP no hay ningún misterio, pasando el descriptor del fichero a un thread/fork ya estaría solucionado, sería un thread/fork por cliente, eso no es problema.
Alguien puede ayudarme/darme alguna idea? Gracias.
Saludos
TCP funciona de la siguiente manera:
Un cliente envía una petición de conexión a un puerto conocido (80 p.ej.) el servido responde aceptando la conexión y reenrutandola a otro puerto (1025 p.ej) a partir de ese momento se establece una conexión entre el cliente y el servido por el puerto 1025 dejando libre el 80 para aceptar mas conexiones. Podrías hacer algo parecido con UDP.
Entiendo que usas UDP para mejorar el rendimiento, desde este punto de vista, NUNCA deberías usar forks para atender a cada petición por el coste de cambio de contexto.
A partir de aquí hay múltiples soluciones dependiendo de tus necesidades puntuales.
Si quieres máximo rendimiento podrías no usar ningún thread ( select() )...
Si las peticiones son ligeras pero no las respuestas podrías recoger las peticiones con un solo thread y responder con otros threads...
Una última cosa: a veces usar threads implica olvidarte de los problemas que tienes delante para encontrártelos en la próxima esquina. Depende del nivel de dependecia entre ellos. Por ejemplo, si comparten buffers, tendrás que tener un mecanismo para impedir la concurrencia.