/ / ¿Lee el paquete UDP más reciente deshabilitando SO_RCVBUF en Java DatagramSocket? - Java, sockets, redes, udp

Lee el paquete UDP más reciente al deshabilitar SO_RCVBUF en Java DatagramSocket? - java, sockets, redes, udp

Necesito leer el UDP entrante más recientepaquete, independientemente de los paquetes perdidos entre lecturas. Los paquetes entrantes llegan 3 veces más rápido que la velocidad máxima de procesamiento de la aplicación. En un intento de lograr esto, utilicé setReceiveBufferSize(int size) de java DatagramSocket clase para establecer el SO_RCVBUF para ser del mismo tamaño que mi paquete esperado en bytes.

Sin embargo, todavía hay un retraso de tres paquetes antes de que reciba el paquete más reciente (y si la velocidad de entrada es 10 veces la velocidad de recepción, hay un retraso de 10 paquetes). Esto sugiere que SO_RCVBUF contiene más que solo el paquete más nuevo.

Primero, son las unidades de setReceiveBufferSize(int size) en bytes? No se establece explícitamente en el Javadocs. En segundo lugar, ¿hay una manera de deshabilitar SO_RCVBUF ¿Para que solo reciba el paquete entrante más reciente? Por ejemplo, cero es un argumento ilegal para la función, pero teóricamente podría establecer el tamaño del búfer de recepción en uno.

Respuestas

1 para la respuesta № 1

esto parece un problema inusual;)

Yo recomendaría dividir su aplicación en hilos separados:

  • receptor (trabajo mínimo, sin análisis / etc)
    • maneja los paquetes entrantes y coloca el último objeto leído en una variable asíncrona
  • procesamiento (por lo que escribiste, parece que esto lleva mucho tiempo)
    • lee el objeto desde el espacio asíncrono y lo procesa (no olvide ignorar el anterior)

si necesita hackear cosas como SO_RCVBUF, creo que debería acercarse un poco más al subsistema de procesamiento de io con C / C ++


0 para la respuesta № 2

Has hecho exactamente lo incorrecto. Establecer el búfer de recepción lo más grande posible. 512k por ejemplo. Si se establece bajo solo aumenta la probabilidad de que se caigan paquetes. Y acelere el código de recepción o reduzca la velocidad del código de envío. No tiene sentido enviar paquetes que no puedan recibirse.