我有一个实现,它使用 ioctl(FIONREAD) 来确定 Linux 中原始套接字接收缓冲区中未决八位字节的数量,然后对其调用 recv。
我在某处读到,Linux 中原始套接字的 ioctl 接口实际上并没有返回实际的待处理八位字节。它是否正确?
我之所以问,是因为我时不时地在高负载下丢失一些消息,到目前为止还无法弄清楚在哪里。他们是找出原始套接字中待处理八位字节数的更好方法吗?
如果您的应用程序无法跟上数据包速率(因为内核缓冲区不是无限的),内核总是有可能丢弃数据包。
顺便说一句,你为什么还需要知道八位字节的数量?由于这些是数据包套接字,数据包的长度将始终受到网络接口的最大帧大小的限制,因此只需将足够大的缓冲区传递给 recv。
话虽如此,如果性能至关重要,您应该研究Linux 上的PACKET_MMAP支持。