0
我有一個實現,它使用ioctl(FIONREAD)來確定Linux中原始套接字接收緩衝區中未決八位字節的數量,然後調用recv。ioctl FIOREAD在Linux中的原始套接字
我在某處讀到Linux中原始套接字的ioctl接口實際上並未返回實際掛起的八位字節。它是否正確?
我在問,因爲我現在在高負載上丟失了一些消息,到目前爲止還沒有找到答案。他們是找出原始套接字中待處理八位組的數目的更好方法。
我有一個實現,它使用ioctl(FIONREAD)來確定Linux中原始套接字接收緩衝區中未決八位字節的數量,然後調用recv。ioctl FIOREAD在Linux中的原始套接字
我在某處讀到Linux中原始套接字的ioctl接口實際上並未返回實際掛起的八位字節。它是否正確?
我在問,因爲我現在在高負載上丟失了一些消息,到目前爲止還沒有找到答案。他們是找出原始套接字中待處理八位組的數目的更好方法。
如果您的應用程序無法跟上數據包速率(因爲內核緩衝區不是無限的),內核始終有可能丟棄數據包。
順便說一句,爲什麼你需要知道八位字節的數量呢?由於這些是數據包套接字,數據包的長度總是受限於網絡接口的最大幀大小,因此只需傳遞足夠大的緩衝區即可接收。
話雖如此,如果性能至關重要,您應該考慮在Linux上支持PACKET_MMAP。
我使用的實現使用ioctl系統調用來確定未讀數據包的數量。我改變了它的硬編碼到2048,我看到沒有更多的數據包丟失。謝謝。 – 2009-05-06 13:17:04