У меня создалось впечатление, что неустойчивость UDP является свойством физического уровня, но кажется, что это не так:«Правильный» способ отправки последовательности дейтаграмм UDP?
Я пытаюсь отправить сообщение через UDP, который разделен на последовательность пакетов , Идентификация сообщения и повторный заказ выполняются неявно.
Я протестировал этот метод на двух приложениях, работающих на одном компьютере, и ожидал, что он будет работать бесперебойно. Однако, несмотря на то, что обмен данными был между двумя программами на одной машине, были потери пакетов и довольно частые. Потери также кажутся довольно случайными: иногда вся информация проходила, иногда нет.
Теперь факт, что потери происходят даже на одной машине, заставляет меня удивляться, что я делаю это правильно?
Первоначально я отправил все сообщения сообщения асинхронно в одноразовый файл, не дожидаясь завершения одного сеанса до отправки следующего сообщения.
Затем я попытался отправить следующий фрагмент сообщения из процедуры завершения предыдущей. Это улучшило коэффициент потери пакетов, но не помешало ему вообще.
Если я добавил паузу (Sleep (...)) между точками, она работает на 100%.
EDIT: Как следует из ответов: пакеты просто отправляются слишком быстро, а ОС выполняет минимальную буферизацию. Это логично.
Итак, если я хотел бы предотвратить добавление подтверждения и повторной передачи в систему (я мог бы просто использовать TCP тогда), что мне делать? Каков наилучший способ улучшить коэффициент потери пакетов, не отбрасывая datarate до уровней, которые могли быть выше?
EDIT 2: Это произошло со мной, что проблема не может быть точно буфер-переполнения, а не буферная inavailablity. Я использую async WSARecvFrom для получения, который берет буфер, который, как я понимаю, переопределяет буфер OS по умолчанию. Когда датаграмма получена, она подается в буфер, и процедура завершения называется wether, когда буфер заполнен или нет.
В этот момент для обработки входящих данных не существует никакого буфера, пока WSARecvFrom не будет повторно вызван из процедуры завершения.
Вопрос в том, есть ли способ создать какой-то буферный пул, чтобы данные могли буферизироваться при обработке другого буфера?
Вы отправляете пакеты до 127.0.0.1 или на свой внешний IP-адрес? – avakar
@avakar: localhost, aka 127.0.0.1. – 2009-05-20 13:22:27
re your new edit - читать http://tools.ietf.org/html/rfc2309 – Alnitak