Как написать простой текстовый протокол, желательно на С - PullRequest
2 голосов
/ 24 декабря 2009

Я хочу написать клиентскую программу, которая взаимодействует с сервером приложений через стандарт TCP/IP. Клиент может общаться с сервером приложений и проходить проверку подлинности, просто говоря по определенному текстовому протоколу. Трафик будет зашифрован, но не будет username/password. Если другое приложение пытается установить связь с сервером приложений и если приложение не использует правильный текстовый протокол, сервер приложений будет молча отбрасывать пакеты.

В ожидании предложений.

Ответы [ 8 ]

5 голосов
/ 24 декабря 2009

Вы можете использовать упрощенную версию TLV (Значение длины тега).

Основная идея состоит в том, чтобы определить набор типов сообщений, которые представлены кодом фиксированного размера (T для тега). В зависимости от типа сообщения его содержимое (V для значения) может очень, поэтому вы указываете его длину (L для длины) перед содержимым. Поле Длина также имеет фиксированный размер

Предположим, у вас есть одно сообщение, используемое для отправки пользовательских данных на сервер. Вы можете определить сообщение как:

0x01 0x0018 0x11 0x0003 tom 0x12 0x000F tom@hotmail.com

Tag: 0x10 User data. Length: 0x0018 Value: sub tags

    Tag 0x11: user name Length: 0x0003 Value = tom
    Tag 0x12: email. Length: 0x000F. Value = tom@hotmail.com

Отредактированный :

Я собирался забыть: Счастливого Рождества :) 1014 *

4 голосов
/ 24 декабря 2009

Взгляните на BEEP .

Вы также можете найти несколько хороших примеров на four.livejournal.com ; он получил хорошие результаты, написав парсер HTTP , используя генератор состояний Ragel , а также вручную.

2 голосов
/ 29 декабря 2009

Все остальные комментарии хороши, и такие вещи, как BEEP, или выполнение какой-либо пользовательской кодировки TLV могут помочь вам, а также использовать что-то вроде буферов протокола Google, но ни один из них я бы не назвал очень простым .

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

Если вы хотите использовать легкие рамки, посмотрите на libevent. Он может помочь в вашем вводе-выводе и чтении с разделителями.

Если язык (протокол) еще не определен для вас, то это то, что вы должны спроектировать в первую очередь или посмотреть на то, что уже существует - XML, куски JSON, цепочки строк и т. Д.

2 голосов
/ 24 декабря 2009

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

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

- редактировать -

Если ваша цель - понять программирование, связанное с веб-серверами, вы, возможно, захотите прочитать код apache, разбитый группой FMC, в коллекцию моделей . Я прочитал этот PDF несколько раз - это абсолютная золотая жила.

1 голос
/ 24 декабря 2009

Для связи между заказными приложениями вы можете просто отправить свой текстовый формат в пакетах TCP. Вы можете использовать чрезвычайно простой текстовый формат, но вы должны убедиться, что он начинается с некоторого текста, который четко указывает вашему серверу, что это пакет от вашего клиента, а не от самозванца. (Понятно, что это не очень хорошая безопасность, но не в этом вопрос).

Хорошее место для начала - использовать XML для вашего текстового формата. Это очень просто для записи / чтения, а также гибкий и расширяемый, так что вы можете легко добавить больше информации к вашим пакетам позже - самое большое, что вы можете ошибиться - это использовать формат связи, который не может быть расширен!

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

Итак, правильное направление:

  • Получите две программы, говорящие по TCP. На данном этапе достаточно простого пакета с текстом «bob», чтобы убедиться, что обмен сообщениями работает. В Интернете можно найти множество простых учебных пособий, и вам понадобится всего несколько строк кода, когда вы решите, что нужно.

  • Затем создайте свои пакеты. Начните с самого простого подхода, который дает вам уникальный идентификатор (чтобы убедиться, что пакет от правильной программы) и средство для добавления новых данных в пакет легко в будущем. XML идеально подходит для этого. Не беспокойтесь о безопасности, просто сконцентрируйтесь на реальном «разговоре», который вы хотите передать между программами - какие данные они хотят обменять и как их кодировать.

  • Шаг за шагом улучшайте коммуникационный протокол, пока он не достигнет того, что вы хотите - меньшего размера, более быстрого, двоичного, более надежного, отказоустойчивого, безопасного и т. Д. Каждый из этих этапов будет интересной небольшой проблемой и к тому времени вы сделали их все, вы многому научились.

1 голос
/ 24 декабря 2009

Вы можете посмотреть некоторые примеры кода из Сокетов TCP / IP в C .

В нем много примеров взаимодействия клиент / сервер на C. Без подробностей трудно понять, что вы действительно хотите обработать ...

0 голосов
/ 24 декабря 2009

Посмотрите на главу о текстовых протоколах в ' Искусство программирования UNIX ' Э. С. Раймонда. Он охватывает много соответствующих идей на высоком уровне, с хорошими примерами и объяснениями того, почему они являются хорошими примерами. Здесь упоминается BEEP.

0 голосов
/ 24 декабря 2009

Я недавно прочитал книгу на эту тему. Это называется «TCP IP Sockets in C» Майкла Дж. Донаху и Кеннета Л. Калверта. Если вы можете себе это позволить, это хороший учебник / справочник.

Если вы хотите, вы можете попробовать создать пару клиентских <-> серверов в Java , так как идею легче понять, а затем переосмыслить решение на более низком уровне в C.

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