通过在Java DatagramSocket中禁用SO_RCVBUF来读取最新的UDP数据包?

时间:2012-07-14 19:53:00

标签: java sockets networking udp

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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