Каков наилучший способ реализации протоколов? - PullRequest
5 голосов
/ 30 октября 2008

Скажем, вы пишете приложение, которое должно реализовывать протокол HTTP. Протоколы довольно сложны и могут разрешать несколько команд в зависимости от того, на какой стадии транзакции они находятся.

В качестве примера посмотрите на SMTP. SMTP-сервер должен выдать ошибку, если команда «data» отправлена ​​до получения «rcpt» и «mail».

Мой вопрос: каков наилучший способ обработки таких протоколов в коде? Есть ли какие-либо шаблоны дизайна, связанные с этим?

Редактировать: Этот вопрос относится к теории реализации протоколов. Я знаю, что использование библиотеки - лучший подход на практике.

Ответы [ 4 ]

12 голосов
/ 30 октября 2008

конечные автоматы

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

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

1 голос
/ 30 октября 2008

Лучший способ обработки таких протоколов - это использовать библиотеку. Почти каждый компьютерный язык, используемый на земле, имеет уже существующие, хорошо протестированные библиотеки для обработки http и smtp.

0 голосов
/ 30 октября 2008

Я согласен с a28, лучше всего либо:

  • Использовать библиотеку, которая реализует протокол сервера
  • Напишите ваше приложение как расширение существующего сервера (например, расширение веб-сервера через IIS, API-интерфейсы Apache и т. Д., Sendmail Milter и т. Д.) ИЛИ
  • Измените существующий сервер, чтобы вызывать RPC-вызовы для вашего приложения при получении запросов.

Написание собственной реализации протокола может привести к ошибочной реализации с проблемами взаимодействия.

Интересным инструментом для этого является витая , которая специфична для Python, но довольно умна и включает в себя реализации многочисленных существующих протоколов (HTTP, SMTP, IRC и т. Д.).

0 голосов
/ 30 октября 2008

@ fluffels @

Зед Шоу (автор Mongrel) согласен с вами ; он использует Ragel .

...