Каковы наиболее часто используемые средства управления потоком для обработки протокола обмена данными? - PullRequest
2 голосов
/ 15 сентября 2008

Я переписываю код для обработки некоторых встроенных сообщений, и сейчас обработка протокола реализована в цикле while с большим оператором case / switch Этот метод кажется немного громоздким. Каковы наиболее часто используемые методы управления потоком для реализации протоколов связи?

Ответы [ 4 ]

1 голос
/ 24 сентября 2008

Похоже, что "while + switch / case" - это реализация состояний машины. Я считаю, что хорошо продуманный механизм состояний часто является наиболее простым и читаемым способом реализации протокола.

Когда дело доходит до машин состояний, нарушение некоторых традиционных правил программирования сопровождается территорией. Правила типа «каждая функция должна быть менее 25 строк» ​​просто не работают. Можно даже утверждать, что государственные машины являются замаскированными GOTO.

0 голосов
/ 15 сентября 2008

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

Если в вашем операторе switch есть какой-либо код для обработки сообщений, вам лучше их разбить.

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

0 голосов
/ 15 сентября 2008

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

Например, в python вы можете создать объект Dictionary из всех различных операторов обработки и просто выполнить итерацию по нему, чтобы найти правильный метод / функцию для вызова.

Операторы Case / Switch не являются плохими вещами, но если они становятся большими (как они могут с огромным количеством обработчиков протоколов), то они могут стать громоздкими для работы.

0 голосов
/ 15 сентября 2008

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

Вы должны обрабатывать все возможные значения в этом массиве, даже те, которые недопустимы. В конце концов вы получите пакет, содержащий недопустимое значение, либо потому, что кто-то пытается атаковать, либо потому, что будущая версия протокола добавляет новые значения.

...