Я подозреваю, что проблема здесь проста: вы используете UDP как TCP. UDP основан на пакетах, но a: не гарантирует, что пакеты будут доставлены по порядку, а b: не гарантирует, что пакеты не будут отброшены или дублированы.
Я полностью ожидаю, что у вас есть некоторые не в порядке. Если вы отправляете несколько сообщений, возможно, что некоторые из них были отброшены, и вы включили несколько из следующего сообщения.
Чтобы использовать сеть так, как этого требует ваш код: используйте TCP. В противном случае ответственность за определение неупорядоченных, отброшенных и дублированных пакетов лежит полностью на вас. Это может быть, например, путем добавления порядкового номера к пакету и отслеживания того, что было получено - переупорядочивание их по мере необходимости, удаление дубликатов и повторный запрос любого, который умер в пути. В основном, переписывая все, что добавляет TCP! Если у вас нет очень специфического сценария, есть хороший шанс, что стек TCP (с поддержкой NIC и уровня ОС) справится с этим лучше, чем вы.