Ну, я думаю, у каждого есть свой «любимый» способ. При получении блоков протокола через поток байтов на любом объектно-ориентированном языке я обычно запускаю каждый полученный байт в экземпляр класса «ProtocolUnit», вызывая его метод «bool addByte()». Конечный автомат в классе обрабатывает байты и проверяет собранные поля на наличие ошибок/состояний. Если ProtocolUnit был получен полностью, функция метода addByte() возвращает значение true, чтобы указать вызывающей стороне, что PDU был правильно собран. Обычно экземпляр затем ставится в очередь тому, кто будет его обрабатывать, и создается новый ProtocolUnit (или депулируется), чтобы он мог начать сборку следующего PDU.
Неявно подразумевается, что начало сообщения может быть идентифицировано, так что в случае ошибки машина состояний может либо сбросить себя, сбрасывая ошибочные данные, либо возвращая «true» вызову addByte(), устанавливая подходящее сообщение об ошибке, которое вызывающая сторона может проверить, чтобы решить, что делать (например, если свойство errorMess равно "", тогда очередь в обработчик, иначе очередь в регистратор ошибок).
Я уверен, что вы считаете это огромным излишеством, но это работает для меня :)
С уважением, Мартин
PS старайтесь избегать протоколов, в которых длина передается в начале и это единственный способ определить начало/конец сообщения. Это очень хрупкий и подверженный взрыву, особенно с незащищенными транспортами, такими как UDP. Даже с TCP я знал маршрутизатор x****x, который время от времени добавлял нуль к пакетам...
person
Martin James
schedule
04.06.2011
byte[]
из структуры, содержащейbyte
.) - person Cody Gray   schedule 04.06.2011