2009-04-30 91 views
0

我有一个实现,它使用ioctl(FIONREAD)来确定Linux中原始套接字接收缓冲区中未决八位字节的数量,然后调用recv。ioctl FIOREAD在Linux中的原始套接字

我在某处读到Linux中原始套接字的ioctl接口实际上并未返回实际挂起的八位字节。它是否正确?

我在问,因为我现在在高负载上丢失了一些消息,到目前为止还没有找到答案。他们是找出原始套接字中待处理八位组的数目的更好方法。

回答

1

如果您的应用程序无法跟上数据包速率(因为内核缓冲区不是无限的),内核始终有可能丢弃数据包。

顺便说一句,为什么你需要知道八位字节的数量呢?由于这些是数据包套接字,数据包的长度总是受限于网络接口的最大帧大小,因此只需传递足够大的缓冲区即可接收。

话虽如此,如果性能至关重要,您应该考虑在Linux上支持PACKET_MMAP

+0

我使用的实现使用ioctl系统调用来确定未读数据包的数量。我改变了它的硬编码到2048,我看到没有更多的数据包丢失。谢谢。 – 2009-05-06 13:17:04