У меня имеется приложение-сервер, которое в бесконечном цикле генерируется случайные числа, которые отправляются через UdpClient.Send() на широковещательный групповой адрес.
Есть приложение-клиент, которое в также в бесконечном цикле с помощью UdpClient.Reсeive() принимает пакеты. Пока всё нормально. Теперь я хочу сымитировать потерю пакетов - перед UdpClient.Reсeive() ставлю Thread.Sleep(1000). Но потери не происходит - после слипа клиент получает следующий по порядку отправления пакет, как будто слипа и не было, а пакеты хранились где-то в промежуточном месте. Мало того, даже если завершить сервер, то клиент продолжит получать откуда-то пакеты, пока не получит все, отправленные сервером.
В чем проблема?
У UdpClient есть буфер, в который складываются полученные данные.
Размер его доступен (get set) в свойстве ReceiveBufferSize.
Если данные приходят, а вы их не прочитали, то данные по кругу затираются - то есть происходит потеря пакетов.
Но вот цикличного затирания буфера я не замечаю: сервер отправляет в секунду 50000 пакетов по 12 байт, клиент читает 1 пакет в секунду и у клиента буфер 65536 байт, то есть за секунду буфер должен был перезаписаться и пакеты должны были начать теряться, но этого не происходит.