Если у вас есть очень веская причина для использования UDP и вам нужны все ваши данные (т.е. вы не можете допустить любые потерянные данные), тогда есть несколько вещей, которые вам нужныto do (это предполагает одноадресное приложение):
- Добавление порядкового номера в заголовок для каждого пакета
- Ack каждого пакета
- Настройка повторной передачитаймер, который повторно отправляет пакет, если подтверждение не получено
- Отслеживание RTT задержки (время прохождения туда и обратно), чтобы вы знали, как долго устанавливать таймеры на
- Потенциально иметь дело с поступлением данных вне очередиэто важно для вашего приложения
- Увеличьте размер буфера приема на клиентском сокете .
Кроме того, вы можете отправлять так быстро, что вы отбрасываете пакеты внутри наотправив машину без них, даже вытащив сетевой адаптер на провод.В некоторых системах вызов с помощью select для возможности записи на передающем сокете может помочь в этом.Кроме того, вызов connect на сокете UDP может повысить производительность, что приведет к уменьшению количества пропущенных пакетов.
По сути, если вам требуется гарантированная доставка ваших данных в порядке, чем вы собираетесь повторно внедрить TCP поверх UDP,Если единственной причиной, по которой вы используете UDP, является задержка, то вы, вероятно, можете использовать TCP и отключить алгоритм Nagle .Если вам нужны пакетированные данные с надежной доставкой с малой задержкой, другая возможность - SCTP , также с отключенным Nagle.Он также может обеспечить доставку вне очереди, чтобы еще больше ускорить процесс.
Я бы порекомендовал Стивену " Unix Network Programming ", в котором есть раздел, посвященный расширенному UDP и когда это целесообразноиспользуйте UDP вместо TCP.Как примечание, он рекомендует не использовать UDP для массовой передачи данных, хотя реальность такова, что в наши дни это становится все более распространенным явлением для потоковых мультимедийных приложений.