簡體   English   中英

如何設置Socket UDP下面的緩沖區大小? C#

[英]How can I set the buffer size for the underneath Socket UDP? C#

正如我們所知道的UDP接收,我們使用Socket.ReceiveFrom或UdpClient.receive

Socket.ReceiveFrom接受你的一個字節數組來放入udp數據。

UdpClient.receive直接返回數據所在的字節數組

我的問題是如何設置Socket內的緩沖區大小。 我認為操作系統維護自己的緩沖區來接收UDP數據,對吧? 例如,如果將udp數據包發送到我的機器,操作系統會將它放到緩沖區並等待我們進入Socket.ReceiveFrom或UdpClient.receive,對吧?

如何更改內部緩沖區的大小?

我嘗試過Socket.ReceiveBuffSize,它對UDP沒有任何影響,它清楚地說它是用於TCP窗口的。 此外,我做了很多實驗,證明Socket.ReceiveBufferSize不適用於UDP。

任何人都可以分享UDP內部緩沖區的一些見解???

謝謝

我在這里看過一些帖子,例如,

http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/c80ad765-b10f-4bca-917e-2959c9eb102a

Dave說Socket.ReceiveBufferSize可以為UDP設置內部緩沖區。 我不同意。

我做的實驗是這樣的:

27台主機同時在局域網內向我發送一個10KB的udp數據包(至少差不多)。 我有一個while循環來處理每個數據包。 對於每個數據包,我創建一個處理它的線程。 我使用UdpClient或Socket接收數據包。

我丟失了大約50%的數據包。 我認為這是UDP發送的爆發,我無法及時處理所有這些。

這就是為什么我想增加UDP的緩沖區大小。 比方說,如果我將緩沖區大小更改為1MB,那么緩沖區中可以接受27 * 10KB = 270KB的數據,對嗎?

我嘗試將Socket.ReceiveBufferSize更改為許多值,它根本就沒有效果。

任何人都可以幫忙嗎?

我經常使用.NET UDPClient ,並且我一直使用Socket.ReceiveBufferSize並且效果很好。 在內部,它使用ReceiveBuffer參數調用Socket.SetSocketOption 以下是一些快速,簡單的代碼,您可以使用以下代碼進行測試:

public static void Main(string[] args)
{
  IPEndPoint remoteEp = null;
  UdpClient client = new UdpClient(4242);
  client.Client.ReceiveBufferSize = 4096;

  Console.Write("Start sending data...");
  client.Receive(ref remoteEp);
  Console.WriteLine("Good");

  Thread.Sleep(5000);
  Console.WriteLine("Stop sending data!");
  Thread.Sleep(1500);

  int count = 0;
  while (true)
  {
    client.Receive(ref remoteEp);
    Console.WriteLine(string.Format("Count: {0}", ++count));
  }
}

嘗試調整傳遞給ReceiveBufferSize的值。 我測試了5秒內發送一個恆定的數據流,並獲得了10個數據包。 然后我增加了x4,下一次獲得了38個數據包。

我會查看您網絡中可能丟棄數據包的其他位置。 特別是因為您在其他帖子中提到您正在發送10KB數據包。 當將10KB發送到MTU大小的數據包時,它將被分段。 如果系列中的任何1個數據包被丟棄,則整個數據包將被丟棄。

設置ReceiveBufferSize的問題是您需要在創建UdpClient對象后直接設置它。 我在獲取ReceiveBufferSize的值時沒有反映出我的更改時遇到了同樣的問題。

UdpClient client = new UdpClient()
//no code inbetween these two lines accessing client.
client.Client.ReceiveBufferSize = somevalue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM