Crear servidor UDP

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
En UDP en realidad es lo mismo.

Depende de el tamaño de lo que envies, si cabe en un paquete o no.

Si cabe no tienes que hacer nada, los procesas y listo.

Si no cabe, te toca hacer a ti el trabajo sucio: (La U de UDP)

- Identificar a los clientes por su ip/puerto y crearles un hilo.
- Ordenar los paquetes que te mandan (y si tu haces el cliente, los que les mandes a los clientes) cada uno, haciendo listas.
Recuerda siempre que con UDP se pueden perder paquetes y que el protocolo no está para tí para pedirlos de nuevo, no como con TCP donde es el sistema en sí el que controla que si falta un paquete lo vuelva a pedir y tal.

Te recomiendo que añadas información en el cuerpo del paquete que te ayude a identificar de todo, es decir, de donde vienes, cuantos paquetes se han mandado, y todo eso, así puedes ir consumiendo los paquetes y cuando falte alguno puedes pedirlo de nuevo (en el caso de que lo necesites, no se el programa que estás haciendo :))
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.
mira no se si te servirá o no, el caso es que hice hace bastante un proyecto en java, que era conectar varios clientes a un servidor mediante udp,vale, lo que hice fue crear un servidor que siempre estubiera "escuchando" y los clientes fueran hilos o threads que creaban un paquete udp y lo mandarán al servidor. no se si te abrá servidor de ayuda o si eso es lo que tu querias, de todas maneras ahora mismo no te lo puedo mirar, pero si quieres puedo mirar como lo hice en java y aver si lo puedes adaptar a c
4 respuestas