Domanda

Ho un'implementazione che usa ioctl (FIONREAD) per determinare il numero di ottetti in sospeso nel buffer di ricezione Raw Socket in Linux e quindi chiamare un recv su quello.

Ho letto da qualche parte che l'interfaccia ioctl per i socket grezzi in Linux non restituisce effettivamente gli ottetti in sospeso. È corretto?

Lo sto chiedendo perché sto perdendo alcuni messaggi ogni tanto su carichi elevati e finora non sono stato in grado di capire dove. È il loro modo migliore per capire il numero di ottetti in sospeso nel Raw Socket.

È stato utile?

Soluzione

Esiste sempre la possibilità che il kernel rilasci i pacchetti se l'applicazione non è in grado di tenere il passo con la frequenza dei pacchetti (poiché il buffer del kernel non è illimitato).

A proposito, perché devi conoscere comunque il numero di ottetti? Poiché si tratta di socket di pacchetti, la lunghezza di un pacchetto sarà sempre limitata dalle dimensioni massime del frame dell'interfaccia di rete, quindi è sufficiente passare un buffer abbastanza grande da recuperare.

Detto questo, se le prestazioni sono fondamentali, dovresti esaminare PACKET_MMAP supporto su Linux.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top