确定BSD平台中下一个UDP数据报的大小?

确定BSD平台中下一个UDP数据报的大小?

问题描述:

在Linux中,我可以使用ioctl调用FIONREAD来获取下一个UDP数据包的字节数。确定BSD平台中下一个UDP数据报的大小?

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

有没有一种方法可以避免在一个大的缓冲区中进行窥视或读取,然后在BSD平台下通过复制实现相同的结果?

FIONREAD在BSD中工作。事实上,这是它的来源。但是它返回可以被读取而没有被阻塞的总字节数,可能是多个数据报。

编辑您可以尝试使用MSG_PEEK | MSG_TRUNC并提供零长度的缓冲区,或者如果不是这样的话,可以提供一个零长度的缓冲区。它应该让你回到真实的长度。

+0

据我所知,它返回整个输出缓冲区(包括标题)的字节数。我无法测试这个,但我们会在不久的将来在freebsd上运行它。 – Matt

+0

我做了一些测试,并决定与额外的memcpy一起生活。事实证明,性能差异可以忽略不计。但是如果有人想知道FIONREAD是否和Linux一样工作,我会留下这个问题。 – Matt

+0

所以这就是你的意思是“不起作用”。您可以尝试使用MSG_PEEK | MSG_TRUNC并提供一个零长度的缓冲区,或者如果不是那样的话,则为一个。它应该让你回到真实的长度。 – EJP