У меня действительно возникают некоторые проблемы с приложением, так как я не реализовал проверки, чтобы избежать дублирования пакетов.
Добавление простой проверки приращения иногда не будет работать, как ожидалось. Почему? Маршрутизаторы могут легко изменять входящие / исходящие маршруты для пакетов UDP даже в режиме реального времени, что может вызвать задержку в некоторых пакетах. Это может вызвать следующий сценарий:
- Программа A отправляет 3 пакета UDP с инкрементными идентификаторами 1, 2 и 3 в Программу B.
- Программа B получает пакеты UDP в порядке 2, 1 и 3. Не то, что вы ожидаете.
Итак, вместо этого я делаю ставку по тому же, но другому механизму:
- Добавьте несколько случайных значений в ваш пакет.
- Создает контрольную сумму пакета, когда ваша программа получает их.
- Сохранить последние N контрольных сумм (например, N = 100) пакетов.
- Каждый раз, когда вы получаете пакет, ищите дублированную контрольную сумму в вашем списке. Сбросить, если найден.
Надеюсь, это поможет вам полностью избежать дублирования пакетов. Не имеет значения, если ваш протокол не зашифрован, случайные значения помогут вам получить уникальные контрольные суммы (надеюсь, у вас не будет коллизии контрольных сумм в последних N пакетах).