[英]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.