У меня есть приложение для Windows, которое принимает и обрабатывает сообщения XML, передаваемые через UDP. Приложение собирает данные с помощью "сырых" сокетов Windows, поэтому весь пакет уровня 3 виден.
Недавно мы столкнулись с проблемой, которая поставила меня в тупик.
Если сообщения XML (т. Е. Пакеты UDP) имеют большой размер (т. Е.> 1500 байт), они фрагментируются должным образом. Обычно это приводит к сбою процессора XML, поскольку он пытается обработать каждый пакет UDP, как будто это полное сообщение XML. Это известный недостаток системы на данном этапе ее развития.
В Windows 7 именно так и происходит. Фрагменты принимаются и регистрируются, но обработки не происходит. Однако в Windows XP видны те же фрагменты, и процессор XML, кажется, прекрасно справляется со всем.
Windows XP автоматически собирает фрагменты UDP? Полагаю, я мог ожидать этого для обычного сокета UDP, но это не ожидаемое поведение для «сырого» сокета, ИМО. Кроме того, если это так в Windows XP, почему в Windows 7 поведение не такое же? Есть ли способ включить это?
похоже, что ошибка заключается в том, как процессор XML получает дейтаграммы UDP. Он вообще не должен смотреть на пакеты. Это работа стека UDP.
Процессор XML должен запрашивать у уровня UDP повторно собранные дейтаграммы UDP. Разделение дейтаграмм на пакеты и последующая сборка этих пакетов в дейтаграммы - это задача стека IP и UDP.
Очевидно, что если вы используете сырые сокеты, UDP сломается, если вы не реплицируете это поведение. Но не используйте сырые сокеты, используйте UDP так, как он был предназначен.
Когда вы перехватываете пакеты через необработанный интерфейс, получаете ли вы их до или после повторной сборки IP, зависит от ряда системных параметров, таких как включенные брандмауэры и их правила. Ваш код «работает», если он получает необработанные пакеты после повторной сборки IP. Но полагаться на это невозможно. если повторная сборка не нужна, этого не произойдет, да и не всегда она нужна.