Я обнаружил неожиданную неупорядоченную последовательность получения пакетов в моей программе Linux C ++. После того как я ограничил количество принимаемых сокетов, он снова получил пакеты в последовательности. Кроме того, я также протестировал проблему с boost :: asio или epoll явно, но они оба дают один и тот же результат. С другой стороны, та же самая программа прекрасно работает в среде Windows (с boost.asio).
Я нахожу это довольно странным, я знаю, что протокол udp не гарантирует последовательный прием пакетов. Однако существует только 1 переключатель между отправителем и получателем широковещательной рассылки. Следовательно, выход из строя физически невозможен, я верю. Плюс та же программа отлично работает под Windows OS (в той же сети).
Предположим, что пакет гарантированно поступит в порядке на транспортном уровне. дополнительная проверка порядкового номера не возможна, изменение протокола также не возможно.
Даже локальный обмен данными с локальным хостом может быть доставлен не по порядку, все зависит от реализации. Стеки могут свободно реализовывать очередь LIFO где-нибудь с UDP, поскольку доставка по порядку не требуется. Каждая ОС может и будет вести себя по-разному. Если вы должны использовать UDP, вы ДОЛЖЕН предвидеть пакеты ООО и обрабатывать их.
Других решений пока нет …