program - UDP: lee datos de la cola en fragmentos
socket udp c (2)
Estoy implementando una pequeña aplicación usando UDP (en C). Un servidor envía a un cliente los datos de un archivo determinado en fragmentos de una cantidad determinada (por ejemplo, 100 bytes / llamada). El cliente descarga el archivo y lo guarda en alguna parte. El problema es que el cliente puede recibir un parámetro que indique cuántos bytes leer / llamar.
Mi problema es cuando el servidor envía 100 bytes / llamada, y el cliente está configurado para leer solo 15 bytes / llamada. Los otros 85 bytes se pierden porque el mensaje se elimina de la cola UDP.
¿Hay alguna manera de leer estos mensajes en fragmentos sin eliminarlos de la cola hasta que se lean por completo?
Puede crear un hilo para leer los datos del búfer UDP infinitamente y guardar los datos en un búfer circular. Que el cliente consuma los datos con tu velocidad. Si el Buffer está desbordado, no puede hacer nada. Porque la velocidad de envío del servidor es más rápida que la del cliente.
UDP no permite la lectura fragmentada como lo hace TCP. Leer un mensaje UDP es una operación de todo o nada, ya sea que lea el mensaje completo o ninguno en absoluto. No hay término medio. Debido a eso, los protocolos basados en UDP usan mensajes de tamaño fijo o requieren que ambas partes negocien dinámicamente los tamaños de los mensajes (como lo hace TrivialFTP, por ejemplo).
No hay ninguna razón para que un protocolo UDP requiera el envío de un tamaño de byte para cada mensaje. El tamaño del mensaje en sí mismo dicta implícitamente el tamaño de los datos dentro del mensaje.
Si absolutamente debe determinar el tamaño del mensaje antes de leer el mensaje, puede intentar llamar a recvfrom()
con el indicador MSG_PEEK
y darle un búfer grande para copiar datos (al menos 64K, que un mensaje UDP nunca excederá, a menos que está utilizando Jumbogramas IPv6, pero eso es un problema aparte). La salida le dirá el tamaño real del mensaje que aún está en la cola. Sin embargo, si realiza esta ruta, también puede soltar el indicador MSG_PEEK
y leer siempre con buffers de 64 K, por lo que no hay posibilidad de descartar datos debido a tamaños insuficientes de búfer.