2012-07-14 52 views
0

我需要读取最近传入的UDP数据包,而不管读取之间是否丢失数据包。传入数据包比最大应用处理速度快3倍。为了达到这个目的,我使用了Java的DatagramSocket类的setReceiveBufferSize(int size)来设置SO_RCVBUF与我预期的数据包大小相同。通过在Java DatagramSocket中禁用SO_RCVBUF来读取最新的UDP数据包?

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

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

+0

那么,请记住,套接字保留_oldest_数据,而不是最新的。如果一个数据包到达套接字,那么它将被缓存直到您读取它 - 您无法更改该行为。 (如果套接字缓冲区中没有空间,则较新的数据包将被丢弃) – nos 2012-07-14 21:00:29

+0

啊,谢谢,我不知道。读取之前有没有办法清除SO_RCVBUF? – user1525606 2012-07-14 21:15:49

回答

0

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

我会推荐给你的应用程序分割成单独的线程:

  • reciever(最小的工作,没有解析的/ etc)
    • 处理传入数据包并将最后读取的对象放入异步变量中
  • 处理(从您写的内容看起来像是thi S可长时间)
    • 读取来自asyncronous空间中的对象,并处理它(不要忘记忽略以前)

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

+0

为什么?大多数像SO_RCVBUF这样的东西都可以很好地从Java入侵。 – EJP 2012-07-15 00:10:25

+0

是的,它可以,但我认为你不应该遇到与他们的问题。 – 2012-07-15 09:05:32

0

你已经完成了错误的事情。尽可能大地设置接收缓冲区。例如512k。将其设置为低只会增加数据包丢失的概率。并加快接收代码或减慢发送代码。发送无法接收的数据包毫无意义。

+0

你读过这个问题了吗?如果我不关心丢包,增加缓冲区大小不会对我有所帮助。理想情况下,我将没有缓冲区,以便接收函数直接从电线中拉出。 – user1525606 2012-07-15 00:50:07

+0

你读过答案了吗?减少缓冲区大小也不会帮助你。最近的数据包是将被丢弃的数据包。如果你想读取它们,你必须保持缓冲区有足够的空间,这意味着增加它,并尽可能快地读取它。 – EJP 2012-07-15 01:27:35