Как я могу установить размер буфера для нижнего сокета UDP? - PullRequest
2 голосов
/ 09 марта 2010

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

Socket.ReceiveFrom принимает от вас байтовый массив для помещения данных udp.

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

Мой вопрос заключается в том, как установить размер буфера внутри сокета. Я думаю, что ОС поддерживает свой собственный буфер для приема данных 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

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

Эксперимент, который я провел, выглядит так:

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

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

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

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

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 03 июня 2010

Я иногда отбрасывал пакеты и добился успеха за счет увеличения буфера.

Я использовал UdpClient, и на его сокете я установил большее значение, чем значение по умолчанию (которое составляло 8192 байта). Это решило проблему для меня.

В моем сценарии можно было четко проследить, что чем меньше размер, тем чаще капли, тем больше, тем меньше. Я наконец выбрал значение 2 ^ 18 для моего приложения.

...