Как NetworkStream .NET разграничивает несколько сообщений в одном пакете? - PullRequest
1 голос
/ 02 февраля 2010

Итак, мне было поручено создать инструмент для нашего отдела контроля качества, который мог бы считывать пакеты по проводам и правильно собирать сообщения (они не доверяют нашим журналам ... длинная история).

Приложение, общение с которым я пытаюсь прослушать, использует классы .NET TcpListener и TcpClient для взаимодействия.Перехват пакетов не является проблемой (я использую SharpPcap ).Тем не менее, правильно повторная сборка пакетов в сообщения уровня приложения оказывается немного трудной.

В некоторых пакетах есть конец одного сообщения и начало следующего сообщения, и я не могу понятьКак объект NetworkStream в .NET может сказать, где заканчивается одно сообщение уровня приложения и начинается другое.

Мне удалось выяснить, что любой пакет, содержащий конец сообщения уровня приложения, будет иметьЗаголовок TCP "PSH" (Push) включен.Но я не могу понять, как .NET знает, где именно конец сообщения находится внутри этого пакета.

Данные одного пакета могут выглядеть следующим образом:

/></Message><Message><Header fromSystem=http://blah

Какпоток знает, что отправлять только до конца </Message> приложению и хранить оставшуюся часть до завершения остальной части сообщения?

Не установлены флаги уровня IP для фрагментации и сокеты .NETне знаю протокола прикладного уровня.Так что я нахожу это невероятно неприятным.Любое понимание будет оценено.

1 Ответ

4 голосов
/ 02 февраля 2010

Поток ничего не знает о конце - он должен быть частью протокола приложения.

NetworkStream не имеет ничего встроенного для преобразования данных в объект. Что заставляет вас думать, что это делает? Как выглядит код, которым удается использовать NetworkStream? Возможно, вы выполняете какую-то форму десериализации XML, и код , читающий , автоматически останавливается, когда достигает закрывающего тега?

В основном:

  • Если в вашем протоколе отсутствует префикс-разделитель или длина сообщения, он, вероятно, должен иметь
  • NetworkStream сам по себе очень маловероятно, чтобы делать что-то умное - но если бы вы могли рассказать нам, что вы наблюдаете, мы, возможно, сможем разобраться, что происходит.
...