LINUX.ORG.RU

библиотека, аналогичная construct для Python, но для C

 , ,


0

1

Есть ли возможность сделать функиональность, похожую на construct для C?

Собственно задача глобально - есть сложный и постепенно эволюционирующий протокол обмена между устройствами. Есть сервер на жабе, и клиенты на жабе и нескольких языках программирования, включая C и python. Есть мелкое устройство, куда клиент на питоне не влез. А реализация на C уже пережила множество переписываний и в очередной раз этог требует, так как не была рассчитана на такое изменение. Есть клиент на питоне, там всё просто и легко адаптируемо, в основном благодаря лёгкости описания протокола с испоользованием construct.

Протокол в основном представляет собой tcp соединение, по которому стороны обмениваются сообщениями вопрос-ответ, поля в сообщении в основном фиксированной длины, но есть и переменной длины, и еще есть TLV. Просто хочется уже этот весь срач как-то прибрать, чтобы всё это протокольное хозяйство унифицировать, ну или по-минимуму сделать более простую модифицируемость человеком без двухмесячного разбирательства. Потому как изменение протокола в питоньем клиенте занимает 2 дня вместе с тестированием и бюрократией, а сишного - 2 месяца :(

★★★★★

Конкретно construct касаться не приходилось, но может это поможет: http://zeromq.org/

ZeroMQ comes with the low-level C API. High-level bindings exist in 40+ languages including Python, Java, PHP, Ruby, C, C++, C#, Erlang, Perl, and more.

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

Увы, протокол менять уже слишком поздно, тут уже стадия поддержки :( Он выдается сверху.

slapin ★★★★★
() автор топика

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

anonymous
()

Нет ничего. Можно попробовать написать транслятор из construct в Си.

Еще можно попробовать asn1c, но оно реально замороченное.

tailgunner ★★★★★
()

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

В любом случае 2 месяца на изменение даже нагогнокоженного протокола это как-то слишком много.

mashina ★★★★★
()
Последнее исправление: mashina (всего исправлений: 2)
Ответ на: комментарий от mashina

Ну а если сам совсем никак не осилишь, есть кодогенератор почти для всех яп и формат сериализации google protobuf

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

Протобуф и asn1c знаю, но они гонят свой бинарный формат. А надо подогнать под существующий.

slapin ★★★★★
() автор топика

0_o

construct же это набор костылей чтобы можно было в Python делать то, что в C делается средствами языка?

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

construct же это набор костылей чтобы можно было в Python делать то, что в C делается средствами языка

...через глубины адского ануса.

tailgunner ★★★★★
()
Ответ на: комментарий от ei-grad

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

То есть для заполнения структуры всё-равно нужен отдельный «парсер», и для проверки данных на валидность, и для заполнения структуры. Хранить удобно, но не передавать по сети. К тому же наличие некоторых данных зависит от данных, идущих ранее.

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

slapin ★★★★★
() автор топика

А реализация на C уже пережила множество переписываний и в очередной раз этог требует

Ты что-то делаешь не так. Попробуй перестать переписывать и займись делом.

ziemin ★★
()

А что изменяется в протоколе? Последовательность запросов-ответов или просто набор данных?

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

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

не все, есть еще битовые поля и прочее подобное

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