2010-03-08 44 views
4

我的程序使用UdpClient嘗試從27個主機接收27個響應。響應的大小是10KB。我的寬帶傳入帶寬是150KB/s。爲什麼我無法獲取所有UDP數據包?

27個響應從主機幾乎在同一時間,每10秒發送。

但是,我只能接受8 - 每次17響應。我可以收到的答覆數量相當動態,但在範圍之內。

有誰能告訴我爲什麼?爲什麼我不能收到所有的?

我明白UDP是不可靠的。但我試着在同一時間收到5到10個回覆,但它的工作。我猜網絡鏈接並不是那麼糟糕。

該代碼非常簡單。在27臺主機上,我只是使用UdpClient向我的機器發送10KB。

在我的機器,我有一個UdpClient接收數據報。每次我得到一個數據,我創建一個線程來處理它(基本上處理它意味着只打印出「我收到10KB」,但它運行在一個線程中)。

listener = new UDPListener(Port); 
listener.Start(); 
while (true) { 
    try { 
     UDPContext context = listener.Accept(); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(HandleMessage), context); 

    } catch (Exception) { } 
} 

如果我減少到3KB響應的大小的情況下獲得更好的可以接收大約25答覆。

還有什麼想法? UDP緩衝區問題?

+1

考慮您可以在其他地方你的網絡堆棧丟棄UDP數據包 - 你的寬帶連接上不一定有。 – 2010-03-08 16:50:33

+6

從本質上講,隨着時間的推移發現的是,一旦將UDP「修補」到可靠開始的位置,就會有一個緩慢,笨重,不可靠的TCP堆棧。只是在說'。 – KevinDTimm 2010-03-08 16:53:16

回答

5

正如你所說,UDP不可靠。所以有機會丟包在某個地方。

注意,丟包造成僅僅通過超載交換機/路由器/網卡儘可能不良鏈接。如果有人向您「同時」發送27個10Kb響應。很可能是網卡的緩衝區或附近的交換機已滿,並且數據包丟失。

直到你有一些代碼來顯示,有可能是別的不多說了。

+0

僅使用UDP,哪個可靠性不是問題,速度是最重要的。如果您需要可靠性,請始終使用TCP。 – 2010-03-08 17:05:14

+0

感謝您的回覆。某種緩衝區可能不足以保存數據嗎?或者在我能及時處理數據之前擦除數據? – Jack 2010-03-08 17:08:26

+0

@Jack是的,這就是我說的:)這些緩衝區可能在你的網卡,Windows內核或附近的以太網交換機中。在任何情況下,您都無法做到這一點 - 即使您要增加UDP緩衝區,它們也不能保證它會有所幫助,而且如果丟棄數據包的路由器或交換機也無濟於事。 – nos 2010-03-08 18:22:10

1

10kb數據包可能被分割。如果即使其中一個片斷被丟棄,該包也不能被重新組裝。根據您的網絡,3kb數據包可能不會被分割,但無論如何,它們會被分割得更少,從而增加了它們通過的可能性。您可以運行PMTU發現工具來查找鏈接支持的最大數據包大小。

0

我認爲UDP根本不可靠,所以我認爲這個問題是因爲你遇到了瓶頸問題(它的調用方式如何)UDP發送的一切都是紊亂的,沒有檢查 所以我認爲你必須創建一種這個協議使用UDP,我告訴這個原因,我已經使它 關鍵是試圖發送一個ID的所有包。這樣的接收器知道至極包丟失了,並可以要求他們到發射機,如TCP一般不會

相關問題