【问题标题】:Determining the size of the next UDP datagram in BSD platforms?确定 BSD 平台中下一个 UDP 数据报的大小?
【发布时间】:2014-03-26 03:46:42
【问题描述】:

在 Linux 中,我可以使用带有 FIONREADioctl 调用来获取下一个 UDP 数据包的字节数。

这在 OSX 上不起作用,我必须使用 getsockoptSO_NREAD 调用来确定数据包的字节数。

有没有一种方法可以避免在 BSD 平台下偷看或读取大缓冲区然后复制以达到相同的结果?

【问题讨论】:

    标签: sockets udp freebsd bsd


    【解决方案1】:

    FIONREAD 在 BSD 中工作。事实上,这就是它的来源。但它会返回可在不阻塞的情况下读取的总字节数,可能不止一个数据报。

    编辑您可以尝试使用 MSG_PEEK|MSG_TRUNC 并提供一个缓冲区长度为零,如果不喜欢,则提供一个。它应该返回真实的长度。

    【讨论】:

    • 据我了解,它返回整个输出缓冲区的字节数(包括标题)。我还不能对此进行测试,但我们将在不久的将来在 freebsd 上运行它。
    • 我做了一些测试并决定使用额外的 memcpy。事实证明,性能差异可以忽略不计。但如果有人想知道 FIONREAD 的工作方式是否与 Linux 相同,我会留下这个问题。
    • 这就是你所说的“不起作用”。您可以尝试使用 MSG_PEEK|MSG_TRUNC 并提供一个缓冲区长度为零,或者如果它不喜欢,则提供一个。它应该返回你的真实长度。
    • 是的,我认为“对于下一个 UDP 数据包”已经足够解释了。感谢有关 MSG_PEEK|MSG_TRUNC 的提示。我不知道你可以用 truncate 偷看。实现同样的目标。
    猜你喜欢
    • 2021-06-01
    • 1970-01-01
    • 2012-01-17
    • 2011-10-12
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多