Реализация протоколов связи в C / C ++ - PullRequest
14 голосов
/ 04 февраля 2011

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

Я буду использовать c / c ++, и я свободен в использовании библиотек использования (BSD/ BOOST / Apache) но без лицензии GPL.Я широко использовал C ++, поэтому использование возможностей C ++ не представляет проблем.

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

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

Обновление: Пример протокола, который я хочуреализовать что-то вроде SNEP .

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

Ответы [ 3 ]

10 голосов
/ 04 февраля 2011

Начните с интерфейсов и сообщений.

Объявите интерфейсы сеанса, которые позволяют партнерам обмениваться сообщениями.Объявите сообщения как структуры C ++ с простыми типами, такими как ints, doubles, std :: string's и std :: vectors.Например:

// these are your protocol messages
struct HelloRequest {
    uint32_t seq_no;
    // more stuff
};
struct HelloResponse {
    uint32_t seq_no;
    // more stuff
};

// Session callback for received messages
struct SessionReceiver {
    virtual void connected(Session*) = 0;
    virtual void receive(Session* from, HelloRequest msg) = 0;
    virtual void receive(Session* from, HelloResponse msg) = 0;
    virtual void disconnected(Session*) = 0;
};

// Session interface to send messages
struct Session {
    virtual void send(HelloRequest msg) = 0;
    virtual void send(HelloResponse msg) = 0;
};

// this connects asynchronously and then calls SessionReceiver::connected() with a newly established session
struct SessionInitiator {
    virtual void connect(SessionReceiver* cb, std::string peer) = 0;
};

// this accepts connections asynchronously and then calls SessionReceiver::connected() with a newly accepted session
struct SessionAcceptor {
    virtual void listen(SessionReceiver* cb, std::string port) = 0;
};

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

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

4 голосов
/ 04 февраля 2011

Boost.ASIO является довольно современным, когда речь заходит об асинхронной (или синхронной) сетевой коммуникации в C ++

3 голосов
/ 04 февраля 2011

Взгляните на Буферы протокола Google .

Из описания:

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

Буферы протокола не зависят от языка и платформы, поэтому должны вписываться в ваш проект.Я не смог найти лицензию, но, по крайней мере, нигде не сказано «GPL», которую я мог найти.

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

Но, как правило, вы должны сделать ISR как можно короче.В таких решениях это обычно означает копирование данных в кольцевой буфер.Таким образом, вам не нужно выделять память в ISR.ISR, после копирования данных, должен проинформировать верхние уровни пакета.Если вы можете использовать DMA, используйте это.В этом случае может оказаться возможным отправить уведомление еще до того, как вы начнете передачу DMA.

Возможно, вы также захотите проверить Драйверы устройств Linux , глава 10 особенно.Проверьте часть о Нижних и Верхних Половинах.

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