Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 5

Передача разных типов данных

28.06.2017, 21:29. Показов 1366. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Комрады, прошу совета, в ближайшее время предстоит сделать одно приложение, суть вот в чем... Допустим есть следующие структуры:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Struct1_Module1
{
   int int_type1;
   int int_type2;
   int int_type3;
}
 
struct Struct2_Module2
{
   unsigned long ulong_type;
   std::string name;
}
 
struct Struct3_Module3
{
   std::string str_type1;
   std::string str_type2;
}
На сервере будет запущенно приложение/служба. Это приложение при старте поднимает из конфигурационного файла различные модули (Module1, Module2, Module3) которые реализованы в виде динамических библиотек. Задача состоит в том чтобы с клиента передать на сервер эти структуры, а на сервере получить их и передать соответствующему модулю на обработку. Собственно вопрос в том, каким образом их передавать на сервер, чтобы на нем их было удобно разбирать? Структур у модуля может быть несколько, также списки этих структур и т.д.

Первое что приходит на ум это заворачивать эти структуры в XML или JSON, в них указывать какому модулю следует передать на обработку, на сервере остается только получить из XML/JSON информацию о модуле, передать его в него, а он уже преобразует это все к необходимому виду. Что то подсказывает что это вариант уж черезчур избыточен.

Второе что приходит в голову, использовать что то типа Google Protobuf. Но этот вариант использовать не хотелось бы. Будет использоваться библиотека Poco, хотелось бы сетевое взаимодействие реализовать на ней. Хотелось бы узнать как это делается по уму
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.06.2017, 21:29
Ответы с готовыми решениями:

Передача в функцию данных разных типов
Нужно передать в функцию в качестве аргумента переменную типа ulong a затем переменную типа int Пробовал использовать обобщенный...

Передача разных конкретных типов перечисления в один метод в качестве параметра
Поскольку прямая лобовая передача типа перечисления в метод в качестве параметра невозможна (?), то сделал два (может быть и третий)...

Запись данных разных типов
Здравствуйте! Столкнулся вот с такой дилеммой, не принципиально, но все же: есть форма ввода информации, подразумевающая поле с типом...

5
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
29.06.2017, 09:28
Цитата Сообщение от cr0nk Посмотреть сообщение
Второе что приходит в голову, использовать что то типа Google Protobuf. Но этот вариант использовать не хотелось бы.
cr0nk, чем не нравится Protobuf? Я бы использовал его. Описываем сообщения ввиде .proto файла. Генерируем C++ код. Подключаем на клиенте и на сервере. На отправляющей стороне сериализуем сообщение в виде бинарных данных и посылаем их (обязательно нужно передавать сначала размер данных в сообщении фиксированного размера, например, sizeof(unsigned), в сетевом порядке бит, а потом непосредственно данные, чтобы читатель знал сколько нужно прочитать байт из сокета). На принимающей стороне читаем sizeof(unsigned) байт с размером данных, затем данные непосредственно. Парсим прочитанные из сокета данные.
0
0 / 0 / 0
Регистрация: 01.03.2017
Сообщений: 5
29.06.2017, 11:09  [ТС]
Цитата Сообщение от schdub Посмотреть сообщение
чем не нравится Protobuf? Я бы использовал его
Да собственно нравится всем, просто не хотелось бы использовать что то кроме Poco, т.е. необходимость тянуть ещё одну библиотеку, но главное даже не это. Protobuf хорош для сериализации/десериализации объектов в том случае если заранее известно к какому виду необходимо этот набор байт приводить (ну или по крайней мере так показалось, документация по protobuf осилена мной ещё не в полном объеме). Т.е. данные приходят на сервер, а куда отправлять их дальше я сказать не могу, пока не десериализую их, а это может сделать только модуль к которому они принадлежат, а если у модуля есть несколько функций которые принимают однотипные данные? Хотя на сколько я понимаю это можно опять же включить в данные... Главная проблема понять куда их передать. В случае с скажем с XML я могу сделать примерно так:
XML
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
 
<module name="Module_1" method="doSomeThing">
    <data>
       <Struct1_Module1>
           <int_type1>int_val1<int_type1/>
           <int_type2>int_val2<int_type2/>
           <int_type3>int_val3<int_type3/>
       </Struct1_Module1>   
    </data>
</module>
Т.е. мне достаточно считать на серверной стороне только тег module, от туда получить всю необходимую информацию, а дальше передать все на обработку необходимому модулю, на необходимый метод. Как то так. Как сделать что то подобное в protobuf я пока не нашел
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
29.06.2017, 12:34
Зависит от того что вы хотите достичь. Если скорость обработки - то чистый бинарный маппинг структур, для работы в с веб больше подойдет JSON, ну и так далее.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
29.06.2017, 14:22
cr0nk,
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package Data;
 
message MsgModule1 {
    optional int int_type1 = 1;
    optional int int_type2 = 2;
    optional int int_type2 = 3;
}
 
message MsgModule2 {
    optional long long_type = 1;
    optional string  name = 2;
}
 
// etc...
 
message RootMessage {
    required sting moduleName = 1;
    required sting moduleMethod = 2;
    optional MsgModule1 m1 = 3;
    optional MsgModule2 m2 = 4;
    // ...
}
Между клиентом и сервером вы общаетесь с помощью RootMessage. Заполняете соответсвующие поля какие вам нужно. На серверной стороне непосрественно в модуль передаете уже ссылку на сообщение необходимого модуля.

Добавлено через 8 минут
с помощью repeated полей можно улучшить RootMessage таким образом, что за одно рут сообщение можно будет пересылать сообщения нескольким модулям и/или несколько сообщений для конкретного модуля, но это зависит от ваших данных, задач и методов их решения.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
01.07.2017, 19:13
cr0nk, TLV, поверх него уже сами пилите свой протокол - какому модулю сообщение, какого типа, какие данные и прочее.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.07.2017, 19:13
Помогаю со студенческими работами здесь

переножение разных типов данных
Можно ли в запросе с помощью построителя задать формулу и перемножить разные типы данных. например денежный и числовой?

Хранение данных разных типов
Уважаемые программисты помогите мне понять тему хранение типов данных. 1)например тип int хранит в себе целые числа.область...

Массив из разных типов данных
Всем привет ! Помогите с таким вопросом: Возникла необходимость создать массив из записей с разными типами полей. Я попробовал...

Получение разных типов данных
Суть задачи такова: в функцию передаётся неизвестное кол-во переменных разного типа(а именно: строка, символ, Boolean переменная, целое...

Считывание из Edit разных типов данных
Подскажите пожалуйста, как из edit считать запись в разных типах данных, допустим в edit введено выражение (3+sin(Pi)*cos(0,5)) и надо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru