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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top