Как я могу установить размер буфера для нижнего Сокета UDP? C#

Как мы знаем для UDP, получают, мы используем Сокет. ReceiveFrom или UdpClient.receive

Сокет. ReceiveFrom принимают, что массив байтов от Вас вставляет udp данные.

UdpClient.receive возвращает непосредственно массив байтов, где данные

Мой вопрос - это, Как установить размер буфера в Сокете. Я думаю, что ОС поддерживает свой собственный буфер для, получают данные UDP, правильно? для, например, если udp пакет отправляется на мою машину, ОС будет помещать его в буфер и ожидать нас для Снабжения сокетом. ReceiveFrom или UdpClient.receive, правильно?

Как я могу изменить размер того внутреннего буфера?

Я попробовал Сокет. ReceiveBuffSize, это не имеет никакого эффекта вообще для UDP, и это ясно сказало, что это для окна TCP. Также я сделал много экспериментов, которое доказывает Сокет. ReceiveBufferSize не для UDP.

Кто-либо может совместно использовать некоторое понимание для UDP внутренний буфер???

Спасибо

Я видел некоторые сообщения здесь, для, например,

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

Dave сказал тот Сокет. ReceiveBufferSize может установить внутренний буфер для UDP.Я не согласен.

Эксперимент, который я сделал, похож на это:

27 хостов отправляют 10 КБ udp пакет мне в LAN одновременно (по крайней мере почти). У меня есть цикл с условием продолжения для обработки каждого пакета. Для каждого пакета я создаю поток дескриптор это. Я использовал UdpClient или Сокет для получения пакетов.

Я потерял приблизительно 50% пакетов. Я думаю, что это - пакет отправки UDP, и я не могу обработать всех их вовремя.

Поэтому я хочу увеличить размер буфера для UDP. скажите, если я изменяю размер буфера на 1 МБ, затем 27 * 10 КБ =, данные 270 КБ могут быть приняты в буфере, правильно?

Я пытался изменить Сокет. ReceiveBufferSize ко многим много значений, и это просто не имеет эффектов вообще.

Кто-либо может помочь?

9
задан Jack 9 March 2010 в 17:21
поделиться

1 ответ

Я часто использую .NET UDPClient, и я всегда использовал Socket.ReceiveBufferSize и получаю хорошие результаты. Внутренне он вызывает Socket.SetSocketOption с параметром ReceiveBuffer . Вот простой и быстрый код, с помощью которого вы можете протестировать:

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 пакетов.

Я бы посмотрел в другие места в вашей сети, где вы можете сбрасывать пакеты. Тем более, что вы упомянули в своем другом сообщении , что отправляете пакеты размером 10 КБ.При отправке пакетов размером в MTU 10 КБ будут фрагментированы. Если какой-либо 1 пакет в серии будет отброшен, будет отброшен весь пакет.

11
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: