2009-04-30 9 views
0

Ich habe eine Implementierung, die ioctl (FIONREAD) verwendet die Anzahl der ausstehenden Bytes in der Raw-Socket Empfangspuffer in Linux zu bestimmen und dann einen recv auf das nennen.ioctl FIOREAD auf Raw-Socket in Linux

Ich habe irgendwo gelesen, dass die ioctl-Schnittstelle für Raw Sockets in Linux den tatsächlichen anstehenden Oktetts nicht wirklich zurück. Ist das richtig?

ich frage, weil ich ab und zu auf hohe Belastungen am verlieren und so weit havent in der Lage gewesen, einige Nachrichten, herauszufinden, wo. Ist dies ein besserer Weg, um die Anzahl der ausstehenden Oktette im Raw-Socket zu ermitteln.

Antwort

1

Es besteht immer die Möglichkeit, dass die Kernel-Pakete fallen wird, wenn die Anwendung nicht in der Lage ist mit dem Paketrate zu halten (wie der Kernel-Puffer nicht unbegrenzt ist).

BTW, warum brauchen Sie sowieso die Anzahl von Bytes wissen? Da es sich hierbei um Paket-Sockets handelt, wird die Länge eines Pakets immer durch die maximale Frame-Größe der Netzwerkschnittstelle begrenzt. Übergeben Sie daher einen ausreichend großen Puffer an recv.

Having said that, wenn die Leistung entscheidend ist, sollten Sie PACKET_MMAP-Unterstützung unter Linux suchen.

+0

Die Implementierung, mit der ich arbeite, verwendet ioctl Systemaufruf, um die Anzahl der ungelesenen Pakete zu ermitteln. Ich habe das geändert, um es auf 2048 zu codieren, und ich sehe keinen Paketverlust mehr. Vielen Dank. –