У меня сложилось впечатление, что нестабильность UDP является свойством физического уровня, но, похоже, это не так:
Я пытаюсь отправить сообщение по UDP, которое разбито на последовательность пакетов. Идентификация сообщения и переупорядочение осуществляется неявно.
Я протестировал этот метод на двух приложениях, работающих на одном компьютере, и ожидал, что он будет работать без сбоев. Однако, несмотря на то, что передача данных происходила между двумя программами на одном компьютере, были потери пакетов, причем довольно частые. Потери также кажутся совершенно случайными: иногда все сообщение получено, иногда нет.
Теперь тот факт, что потери происходят даже на одной машине, заставляет меня задуматься, правильно ли я это делаю?
Первоначально я отправил все части сообщения асинхронно в один прием, не дожидаясь завершения одной части перед отправкой следующей.
Затем я попытался отправить следующий кусок сообщения из подпрограммы завершения предыдущего. Это улучшило коэффициент потери пакетов, но не предотвратило его вообще.
Если я добавил паузу (Sleep (...)) между peices, это сработает на 100%.
EDIT:
Как и предполагали респонденты: пакеты просто отправляются слишком быстро, а ОС выполняет минимальную буферизацию. Это логично.
Итак, если я хотел бы запретить добавление подтверждения и повторной передачи в систему (тогда я мог бы просто использовать TCP), что мне делать? Каков наилучший способ улучшить коэффициент потери пакетов без сброса данных до уровней, которые могли бы быть выше?
РЕДАКТИРОВАТЬ 2:
Мне пришло в голову, что проблема может заключаться не в переполнении буфера, а в недоступности буфера.
Я использую async WSARecvFrom для получения, который принимает буфер, который, как я понимаю, переопределяет буфер ОС по умолчанию.
Когда дейтаграмма получена, она подается в буфер, и процедура завершения называется, заполнен буфер или нет.
В этот момент вообще не существует буфера для обработки входящих данных, пока WSARecvFrom не будет повторно вызван из подпрограммы завершения.
Вопрос в том, есть ли способ создать какой-нибудь пул буферов, чтобы данные могли буферизоваться во время обработки другого буфера?