2012-07-14 47 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