ioctl FIOREAD en socket sin procesar en Linux
Pregunta
Tengo una implementación que utiliza ioctl (FIONREAD) para determinar el número de octetos pendientes en el búfer de recepción de Raw Socket en Linux y luego llamar a recv sobre eso.
Leí en alguna parte que la interfaz ioctl para sockets en bruto en Linux no devuelve los octetos pendientes reales. ¿Es esto correcto?
Lo pregunto porque de vez en cuando pierdo algunos mensajes en cargas elevadas y hasta ahora no he podido averiguar dónde. Es una forma mejor de averiguar el número de octetos pendientes en el Socket sin procesar.
Solución
Siempre existe la posibilidad de que el kernel descarte paquetes si su aplicación no puede mantenerse al día con la tasa de paquetes (ya que el búfer del kernel no está ilimitado).
Por cierto, ¿por qué necesitas saber el número de octetos de todos modos? Como se trata de sockets de paquetes, la longitud de un paquete siempre estará limitada por el tamaño máximo de trama de la interfaz de red, por lo que solo debe pasar un búfer lo suficientemente grande como para rec.
Habiendo dicho eso, si el rendimiento es crítico, debería consultar PACKET_MMAP soporte en Linux.