Ну, я думаю, у каждого свой «любимый» путь.При получении протокольных единиц через поток байтов на любом языке OO я обычно запускаю каждый полученный байт в экземпляр класса ProtocolUnit, вызывая его метод bool addByte ().Конечный автомат в классе обрабатывает байты, а ошибка / здравый смысл проверяет собранные поля.Если ProtocolUnit был получен полностью, функция метода addByte () возвращает true, чтобы указать вызывающей стороне, что PDU был правильно собран.Обычно экземпляр затем ставится в очередь, чтобы обработать его, и создается новый ProtocolUnit (или удаляется), поэтому он может начать сборку следующего PDU.
Подразумевается, что начало сообщенияможет быть идентифицирован таким образом, чтобы в случае ошибки конечный автомат мог либо сам себя сбросить, сбросив ошибочные данные, либо вернув true в вызове addByte (), установив подходящий errorMessage, который вызывающий может проверитьрешить, что делать, (например, если свойство errorMess равно "", то очередь к обработчику, иначе очередь к журналу ошибок).
Я уверен, что вы считаете это огромным излишним, но это работает для меня:)
Rgds, Martin
PS старайтесь избегать протоколов, в которых длина передается в начале и является единственным способом определения начала / конца сообщения.Это очень хрупко и подвержено взрывам, особенно с незащищенными транспортными средствами, такими как UDP.Даже с TCP я знаю маршрутизатор ax **** x, который иногда добавляет к пакетам ноль ...