【发布时间】:2012-07-14 19:53:00
【问题描述】:
我需要读取最近传入的 UDP 数据包,无论读取之间丢弃的数据包如何。传入数据包的传入速度比最大应用程序处理速度快 3 倍。为了实现这一点,我使用 Java 的 DatagramSocket 类的 setReceiveBufferSize(int size) 将 SO_RCVBUF 设置为与我预期的数据包相同的大小(以字节为单位)。
但是,在我得到最近的数据包之前仍然有 3 个数据包延迟(如果传入速率是接收速率的 10 倍,则有 10 个数据包延迟)。这表明SO_RCVBUF 不仅仅包含最新的数据包。
首先,setReceiveBufferSize(int size) 的单位是字节吗? javadocs 中没有明确说明。其次,有没有办法禁用SO_RCVBUF,以便我只接收最新传入的数据包?例如,零是该函数的非法参数,但理论上我可以将接收缓冲区大小设置为一。
【问题讨论】:
-
好吧,记住套接字保存的是最旧的数据,而不是最新的。如果一个数据包到达套接字,它将被缓冲,直到您读取它 - 您无法更改该行为。 (如果套接字缓冲区没有空间,新的数据包将被丢弃)
-
啊,谢谢,我不知道。有什么方法可以在读取之前清除 SO_RCVBUF?
标签: java sockets networking udp