Primero, un poco de contexto para explicar por qué estoy en la ruta de "muestreo UDP":
Me gustaría muestrear datos producidos a gran velocidad durante un período de tiempo desconocido. Los datos que deseo muestrear están en otra máquina que no sea la que consume los datos. Tengo una conexión Ethernet dedicada entre los dos para que el ancho de banda no sea un problema. El problema que tengo es que la máquina que consume los datos es mucho más lenta que la que los produce. Una limitación adicional es que, aunque está bien que no obtenga todas las muestras (son solo ejemplos), es obligatorio obtener el último.Cómo hacer que un socket UDP reemplace mensajes antiguos (aún no recv() 'd) cuando llega nuevo?
Mi primera solución fue hacer que el productor de datos envíe un datagrama UDP para cada muestra producida y dejar que el consumidor trate de obtener las muestras que pueda y que la capa de socket descarte cuando el socket UDP esté lleno. El problema con esta solución es que cuando llegan nuevos datagramas UDP y el socket está lleno, son los nuevos datagramas que se descartan y no los antiguos. ¡Por lo tanto, no estoy garantizado para tener el último!
Mi pregunta es: ¿hay alguna manera de hacer que un socket UDP reemplace los viejos datagramas cuando lleguen nuevos?
El receptor es actualmente una máquina Linux, pero eso podría cambiar en favor de otro sistema operativo tipo Unix en el futuro (ventanas pueden ser posibles, ya que implementa sockets BSD, pero es menos probable)
La solución ideal sería el uso generalizado mecanismos (como setsockopt() s) para trabajar.
PD: Pensé en otras soluciones pero son más complejas (implican una gran modificación del remitente), por lo tanto, me gustaría primero tener un estado definido sobre la fiabilidad de lo que pido. :)
actualizaciones: - Yo sé que el sistema operativo en el equipo receptor puede manejar la carga de la red + volver a montar el tráfico generado por el remitente. Es solo que su comportamiento predeterminado es descartar nuevos datagramas cuando el buffer de socket está lleno. Y debido a los tiempos de procesamiento en el proceso de recepción, sé que se llenará haga lo que haga (desperdiciar la mitad de la memoria en un buffer de socket no es una opción :)).
- Realmente me gustaría evitar tener un proceso de ayuda haciendo lo que el sistema operativo podría haber hecho en el momento de despachar paquetes y desperdiciar recursos simplemente copiando mensajes en un SHM.
- El problema que veo al modificar el remitente es que el código al que tengo acceso es solo una función PleaseSendThisData(), no tiene conocimiento de que puede ser la última vez que se llama antes de un tiempo prolongado, entonces yo don No veo ningún truco factible en ese extremo ... ¡pero estoy abierto a sugerencias! :)
Si realmente no hay forma de cambiar el comportamiento de recepción de UDP en un socket BSD, entonces bueno ... sólo dígame, estoy preparado para aceptar esta terrible verdad y comenzaré a trabajar en el "proceso de ayuda" solución cuando vuelvo a ella :)
¿Cuál es la plataforma y el idioma del host receptor? – msw
Pregunta muy bien enmarcada –
¿Sería "consumir" o "leer" un reemplazo adecuado para "explotar" en su pregunta? "Exploit" parece confuso aquí. – nategoose