确定BSD平台中下一个UDP数据报的大小?
问题描述:
在Linux中,我可以使用ioctl
调用FIONREAD
来获取下一个UDP数据包的字节数。确定BSD平台中下一个UDP数据报的大小?
这在OSX上不起作用,相反,我必须使用getsockopt
调用SO_NREAD
来确定数据包的字节数。
有没有一种方法可以避免在一个大的缓冲区中进行窥视或读取,然后在BSD平台下通过复制实现相同的结果?
答
FIONREAD
在BSD中工作。事实上,这是它的来源。但是它返回可以被读取而没有被阻塞的总字节数,可能是多个数据报。
编辑您可以尝试使用MSG_PEEK | MSG_TRUNC并提供零长度的缓冲区,或者如果不是这样的话,可以提供一个零长度的缓冲区。它应该让你回到真实的长度。
据我所知,它返回整个输出缓冲区(包括标题)的字节数。我无法测试这个,但我们会在不久的将来在freebsd上运行它。 – Matt
我做了一些测试,并决定与额外的memcpy一起生活。事实证明,性能差异可以忽略不计。但是如果有人想知道FIONREAD是否和Linux一样工作,我会留下这个问题。 – Matt
所以这就是你的意思是“不起作用”。您可以尝试使用MSG_PEEK | MSG_TRUNC并提供一个零长度的缓冲区,或者如果不是那样的话,则为一个。它应该让你回到真实的长度。 – EJP