1

我需要读取最近传入的 UDP 数据包,无论读取之间丢弃的数据包如何。传入数据包的传入速度比最大应用程序处理速度快 3 倍。为了实现这一点,我使用setReceiveBufferSize(int size)Java 的DatagramSocket类将其设置为SO_RCVBUF与我预期的数据包相同的大小(以字节为单位)。

但是,在我得到最新的数据包之前仍然有 3 个数据包延迟(如果传入速率是接收速率的 10 倍,则有 10 个数据包延迟)。这表明它SO_RCVBUF包含的不仅仅是最新的数据包。

首先,单位是setReceiveBufferSize(int size)字节吗?javadocs中没有明确说明。其次,有没有办法禁用SO_RCVBUF,以便我只接收最近传入的数据包?例如,零是函数的非法参数,但理论上我可以将接收缓冲区大小设置为 1。

4

2 回答 2

1

这看起来像一个不寻常的问题;)

我建议将您的应用程序拆分为单独的线程:

  • 接收者(最少的工作,没有解析/等)
    • 处理传入的数据包并将最后读取的对象放入异步变量中
  • 处理(根据你写的,看起来这需要很长时间)
    • 从异步空间读取对象,并处理它(不要忘记忽略前面的)

如果你需要破解 SO_RCVBUF 之类的东西,我认为你应该更接近使用 C/C++ 的 io 处理子系统

于 2012-07-14T20:31:51.567 回答
0

你做错事了。将接收缓冲区设置得尽可能大。以 512k 为例。将其设置为低只会增加丢包的可能性。要么加快接收代码的速度,要么减慢发送代码的速度。发送无法接收的数据包是没有意义的。

于 2012-07-14T23:57:02.317 回答