【发布时间】:2014-03-26 03:46:42
【问题描述】:
在 Linux 中,我可以使用带有 FIONREAD 的 ioctl 调用来获取下一个 UDP 数据包的字节数。
这在 OSX 上不起作用,我必须使用 getsockopt 和 SO_NREAD 调用来确定数据包的字节数。
有没有一种方法可以避免在 BSD 平台下偷看或读取大缓冲区然后复制以达到相同的结果?
【问题讨论】:
在 Linux 中,我可以使用带有 FIONREAD 的 ioctl 调用来获取下一个 UDP 数据包的字节数。
这在 OSX 上不起作用,我必须使用 getsockopt 和 SO_NREAD 调用来确定数据包的字节数。
有没有一种方法可以避免在 BSD 平台下偷看或读取大缓冲区然后复制以达到相同的结果?
【问题讨论】:
FIONREAD 在 BSD 中工作。事实上,这就是它的来源。但它会返回可在不阻塞的情况下读取的总字节数,可能不止一个数据报。
编辑您可以尝试使用 MSG_PEEK|MSG_TRUNC 并提供一个缓冲区长度为零,如果不喜欢,则提供一个。它应该返回真实的长度。
【讨论】: