我需要读取最近传入的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。
那么,请记住,套接字保留_oldest_数据,而不是最新的。如果一个数据包到达套接字,那么它将被缓存直到您读取它 - 您无法更改该行为。 (如果套接字缓冲区中没有空间,则较新的数据包将被丢弃) – nos 2012-07-14 21:00:29
啊,谢谢,我不知道。读取之前有没有办法清除SO_RCVBUF? – user1525606 2012-07-14 21:15:49