Когда UDP sendto () блокирует? - PullRequest
24 голосов
/ 12 ноября 2010

При использовании поведения по умолчанию (блокирования) для сокета UDP, в каком случае будет вызываться блок sendto ()?В основном меня интересует поведение Linux.

Для TCP я понимаю, что управление перегрузкой блокирует вызов send (), если окно отправки заполнено, но как насчет UDP?Это даже иногда блокирует или просто позволяет пакетам отбрасываться на нижних уровнях?

Ответы [ 2 ]

16 голосов
/ 12 ноября 2010

Это может произойти, если вы заполнили свой буфер сокетов, но он сильно зависит от операционной системы .Поскольку UDP не дает никаких гарантий, ваша операционная система может решить, что делать, когда ваш буфер сокетов заполнен: блокировать или удалять.Вы можете попытаться увеличить SO_SNDBUF для временного облегчения.

Это может даже зависеть от тонкой настройки вашей системы, например, это может также зависеть от размера кольца TX в драйвере вашего сетевого интерфейса.В списке рассылки iperf есть несколько обсуждений, но вы действительно хотите обсудить это с разработчиками вашей операционной системы .Обратите особое внимание на O_NONBLOCK и EAGAIN / EWOULDBLOCK.

9 голосов
/ 12 ноября 2010

Это может быть связано с тем, что ваша операционная система пытается выполнить запрос ARP для получения аппаратного адреса удаленного хоста.

В основном, когда пакет выходит, заголовок требует IP-адрес удаленного хоста и MAC-адрес удаленного хоста.192.168.1.34 и AB: 32: 24: 64: F3: 21.

Ваше поведение "блока" может заключаться в том, что ARP работает.

Я слышал в более старых версиях Windows (я думаю, 2k), что 1-й пакет иногда отбрасывается, если запросзанимает слишком много времени, и вы отправляете слишком много данных.Сервисный пакет, вероятно, исправил это с тех пор.

...