LINUX.ORG.RU

Команды для сервера


0

0

Есть прога-сервер, которая получает данные и управляет железкой. К нему по
TCP подрубается клиент для передачи команд. Вопрос - как лучше организовать
систему команд ? Команда, собственно, имя, аргументы. Пока приходит на ум
только:

struct Commanda {
string name;
string str_arg;
uint32_t arg1;
........
};

Сериализовать и вперед. Может есть готовые решения грамотнее, элегантнее и т.д. ?


если хочешь по уму - надо не просто отправлять, но еще и подтверждение дожидаться.
можно извратиться и какойнить modbus/dibus наворотить.

VladimirMalyk ★★★★★
()
Ответ на: комментарий от ShTH

Точно не знаю, но посмотрите в сторону Qt. Там есть части для работы с сетью.

Ога, там есть обёртки для сокетов, которые для полного счастья на систему сигналов-слотов завязаны (по-умолчанию).

Сериализовать и вперед. Может есть готовые решения грамотнее, элегантнее и т.д. ?

ZeroC Ice

Begemoth ★★★★★
()

RPC какой-нибудь. Или простой для переваривания orb, типа уже посоветованного zeroc ice.

mv ★★★★★
()

> Сериализовать и вперед.
Реймонд в бешенстве. Самый трушный вей это использовать текстовый формат (telnet, ftp).

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

Сериализовать и вперед.

Реймонд в бешенстве.

Его проблемы, особенно если он не знает, что сериализовать можно в текстовый формат.

Самый трушный вей это использовать текстовый формат

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

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Подтверждаю. Отличная вещь и несложная в обращении (если не лезть в дебри глайсера и других прелестей). + биндинги для многих языков + отличная документация.

PS. Можно воспользоваться ASN.1 для сериализации, описать там все команды красиво и элегантно

arhibot
()
Ответ на: комментарий от VladimirMalyk

>можно извратиться и какойнить modbus/dibus наворотить.

modbus будет жирновато для этого, ИМХО.

golodranez ★★★★
()
Ответ на: комментарий от Begemoth

> Ога, особенно для пересылки каких-нибудь измерительных данных, для их отображения в реальном времени (ну и последующей обработки).
Ну так нужно конкретней говорить с начала.
А Рэймонда все таки рекомендую, он много внимания подобным вопросам посвятил.

urxvt ★★★★★
()
Ответ на: комментарий от urxvt

А Рэймонда все таки рекомендую, он много внимания подобным вопросам посвятил.

Я Реймонда читал. Речь бы о том, трушный вей - подбирать/разрабатывать протокол исходя из задачи, и в ряде случаев, связанных с управлением оборудованием текстовые протоколы не подходят.

Begemoth ★★★★★
()

Лежит у меня сейчас на столе отличная книжка: Уильям Стивенс «UNIX: взаимодействие процессов». Советую почитать. Описаны всевозможные методы обмена сообщениями между двумя приложениями (сервер-клиент).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Во-первых у него описывается UNIX IPC: в первую очередь взаимодействие процессов на одной машине. Из описываемых им RPC (Sun RPC и Doors), в Linux поддерживается только Sun RPC. Также для ТС неактуально.

Кстати, где сейчас используется Sun RPC кроме как в NFS?

Begemoth ★★★★★
()
Ответ на: комментарий от Eddy_Em

В самописных клиент-серверных структурах, как, например, у ТС.

Обычный IPC (включая и сокеты) - слишком низкий уровень абстракции для большинства задач. Да и на кой чёрт заморачиваться с переизобретением велосипеда, когда существует море готовых инструментов? Сто раз упомянутый ZeroC Ice, наверное, лучшее или одно из лучших решений для C++, ибо API в нём простой, позволяет использовать свой мощный функционал постепенно с усложнением программы, имеет двойное лицензирование, ну и существует решение для embedded.

Лучшие собаководы, как говорится, рекомендуют.

mv ★★★★★
()

Если есть желание, то можешь глянуть на: git://github.com/urezki/sftpd.git и посметреть как я это делал раньше.

urezki
()

Либо простой текстовый протокол, либо RPC без наворотов (SunRPC вполне подойдет). Ice - это оверкилл.

tailgunner ★★★★★
()

ИМХО самый трушный путь - это структура типа:

uint32 frame_size;  //Размер пакета
uint32 frame_code; // код функции
[данные, специфичные для данного кода frame_code размером frame_size байт]

З.Ы. Не забудь про «пульс» через SO_KEEPALIVE, а ещё лучше через свою функцию на прикладном уровне протокола.

pathfinder ★★★★
()
Ответ на: комментарий от urxvt

>Реймонд в бешенстве. Самый трушный вей это использовать текстовый формат (telnet, ftp).

Для справки, протокол FTP - редкостное ГОВНО !!!

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Протокол может и говно, но текстовый формат доказал свою живучесть и удобство.

urxvt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.