我有一个实现,它使用ioctl(FIONREAD)来确定Linux中Raw Socket接收缓冲区中的待处理八位字节数,然后在其上调用recv。

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

我在问,因为我偶尔会在高负荷下丢失一些信息,到目前为止还没有找到答案。它们是更好的方法来计算原始套接字中未决八位字节的数量。

有帮助吗?

解决方案

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

顺便说一下,为什么你还需要知道八位字节的数量?由于这些是数据包套接字,数据包的长度将始终受到网络接口的最大帧大小的限制,因此只需传递足够大的缓冲区即可进行恢复。

话虽如此,如果性能至关重要,您应该查看 PACKET_MMAP Linux上的支持。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top