UDP, в отличие от TCP, не является надежным протоколом. Он не предоставляет встроенного механизма, который гарантировал бы, что пакеты прибывают в правильном порядке или даже прибывают вообще. Тем не менее, вы можете написать свои подпрограммы send / recv в виде шага блокировки, где каждый раз, когда пакет отправляется, отправитель должен ждать получения ACK, прежде чем отправить снова. Если ACK не получен после определенного времени ожидания, пакет должен быть повторно отправлен. Таким образом вы гарантируете, что пакеты получены в правильном порядке. (Для получения дополнительной информации посмотрите RFC для протокола TFTP , который использует эту стратегию.)
Наконец, если возможно, вы можете рассмотреть возможность использования TCP.