Обратный вызов Socket.BeginReceive - разделитель сообщений - PullRequest
0 голосов
/ 25 сентября 2011

Когда обратный вызов, назначенный Socket.BeginReceive (), получает несколько байтов, каков наилучший способ узнать, что у меня есть все сообщение? Должны ли я иметь первые 4 байта каждого отправляемого сообщения и содержать длину сообщения?

Я отправляю файл XML в каждом сообщении, поэтому в качестве разделителя сообщений я не могу использовать уникальный символ.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Следуйте спецификации для протокола, который вы используете.Если это оригинальный протокол, напишите спецификацию.Это немного дополнительная работа, но она того стоит.

В этой спецификации вы можете указать длину сообщения.Вы также можете запретить определенный байт (вы можете использовать ноль) в полезной нагрузке и использовать его в качестве разделителя сообщений.Поскольку вы используете XML, вы можете просто определить тег, который указывает на сообщение - закрытие этого тега будет означать полное сообщение.Но потратьте время на детализацию вашего протокола.Я обещаю вам, что это окупится.

1 голос
/ 25 сентября 2011

Я бы использовал заголовок, содержащий два целых числа (4 байта каждое).Первый из них будет указывать версию протокола, а второй - длину сообщения.Хорошая вещь с использованием длины заголовка вместо разделителя состоит в том, что вы можете выделить буфер для всего сообщения, прежде чем приступить к его синтаксическому анализу.

Использование целочисленного значения версии в качестве первого заголовка позволит вам изменить остальныезаголовки и тело в любой новой версии протокола.

Обновление в ответ на комментарий

Существует разница между номером версии в заголовке иодин в реальном сообщении.Версия сообщения предназначена для документа, а версия заголовка - для самого протокола.Используя версию протокола, вы можете переключить транспорт сообщений с XML на Protobuf или что-то еще для сообщения.Вы также можете добавить заголовок, идентифицирующий цель фактического сообщения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...