【问题标题】:ioctl FIOREAD on raw socket in LinuxLinux 中原始套接字上的 ioctl FIOREAD
【发布时间】:2009-04-30 11:18:18
【问题描述】:

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

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

我之所以问,是因为我在高负载时时不时地丢失一些消息,到目前为止还无法弄清楚在哪里。他们是找出原始套接字中未决八位字节数的更好方法吗?

【问题讨论】:

    标签: sockets ioctl


    【解决方案1】:

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

    顺便说一句,为什么您仍然需要知道八位字节的数量?由于这些是数据包套接字,因此数据包的长度将始终受到网络接口的最大帧大小的限制,因此只需将足够大的缓冲区传递给 recv。

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

    【讨论】:

    • 我使用的实现使用 ioctl 系统调用来确定未读数据包的数量。我已将其更改为将其硬编码为 2048,并且我没有看到更多的数据包丢失。谢谢。
    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多