Windows XP автоматически собирает фрагменты UDP?

У меня есть приложение Windows, которое получает и обрабатывает XML-сообщения, передаваемые через UDP. Приложение собирает данные с помощью "сырых" сокетов Windows, поэтому весь пакет 3-го уровня виден.

Недавно мы столкнулись с проблемой, которая поставила меня в тупик.

Если сообщения XML (т. Е. UDP-пакеты) имеют большой размер (т. Е.> 1500 байт), они фрагментируются, как и ожидалось. Обычно это приводит к сбою процессора XML, поскольку он пытается обработать каждый пакет UDP, как если бы он был полным сообщением XML. Это известный недостаток системы на данном этапе ее развития.

На Windows 7 это именно то, что происходит. Фрагменты получены и зарегистрированы, но обработка не происходит. В Windows XP, однако, видны те же фрагменты, и процессор XML, кажется, справляется со всем просто отлично.

Windows XP автоматически собирает фрагменты UDP? Я предполагаю, что я мог ожидать этого для обычного сокета UDP, но это не ожидаемое поведение для "сырого" сокета, IMO. Кроме того, если это имеет место в Windows XP, почему поведение не является таким же в Windows 7? Есть ли способ включить это?

1 ответ

Решение

Похоже, ошибка в том, как процессор XML получает дейтаграммы UDP. Он не должен смотреть на пакеты вообще. Это работа стека UDP.

Процессор XML должен запрашивать уровень UDP для повторной сборки дейтаграмм UDP. Разделение дейтаграмм на пакеты и последующая сборка этих пакетов в дейтаграммы - это задача стека IP и UDP.

Очевидно, что если вы используете необработанные сокеты, UDP сломается, если вы не будете повторять это поведение. Но не используйте необработанные сокеты, используйте UDP так, как это было задумано.

Когда вы перехватываете пакеты через необработанный интерфейс, получаете ли вы их до или после повторной сборки IP, зависит от ряда системных параметров, таких как, какие брандмауэры включены и какие у них правила. Ваш код "работает", если он получает необработанные пакеты после повторной сборки IP. Но полагаться на это сломано. если повторная сборка не нужна, это не произойдет, и это не всегда необходимо.

Другие вопросы по тегам