Подкиньте идею как построить класс
От: ingvarwolf Канада  
Дата: 22.05.04 02:53
Оценка:
Всем привет!
У меня программа обменивается с другой программой сообщениями по сетке. Сообщения различаются между собой по типу, все типы заданы как:
#define MSG_READY    0x0001
#define MSG_ERROR    0x0002
#define MSG_DATASENT 0x0003

Так вот, некоторые сообщения не несут никакой дополнительной информации, кроме своего типа (например как MSG_READY, MSG_ERROR из списка вверху), но некоторые сообщения также передают и дополнительную информацию, (MSG_DATASENT). Вот эти дополнительные данные могут быть целым числом (int), дробным числом (double), строкой(std::wstring). Я сначала устроил это так:
/// Тип значения, хранящегося в сообщении
typedef enum Msgval_tag {
    mvtInt,
    mvtDouble,
    mvtString,
    mvtNoVal
} EnValType;

/// Само значение, хранящееся в сообщении
typedef union Msgvalue {
    int n;
    double d;
    wchar_t ws[1024];
} UnValType;

/// Класс сообщения
class Message {
    public:
        DWORD m_dwType;
        EnValType m_enValType;
        UnValType m_unValue;
};

Но что-то мне не сильно нравится вариант с union. Может у кого-то была похожая ситуация — поделитесь идеями... Или может даже не стоит пытаться сделать один класс для хранения значений разного типа?
Или я в принципе не в ту сторону копаю и обмен сообщениями делается гораздо более по-другому?
Спасибо.
Re: Подкиньте идею как построить класс
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 22.05.04 11:51
Оценка:
Здравствуйте, ingvarwolf, Вы писали:

I>Всем привет!

I>У меня программа обменивается с другой программой сообщениями по сетке. Сообщения различаются между собой по типу, все типы заданы как:
I>
I>#define MSG_READY    0x0001
I>#define MSG_ERROR    0x0002
I>#define MSG_DATASENT 0x0003
I>

I>Так вот, некоторые сообщения не несут никакой дополнительной информации, кроме своего типа (например как MSG_READY, MSG_ERROR из списка вверху), но некоторые сообщения также передают и дополнительную информацию, (MSG_DATASENT). Вот эти дополнительные данные могут быть целым числом (int), дробным числом (double), строкой(std::wstring). Я сначала устроил это так:
I>
I>/// Тип значения, хранящегося в сообщении
I>typedef enum Msgval_tag {
I>    mvtInt,
I>    mvtDouble,
I>    mvtString,
I>    mvtNoVal
I>} EnValType;

I>/// Само значение, хранящееся в сообщении
I>typedef union Msgvalue {
I>    int n;
I>    double d;
I>    wchar_t ws[1024];
I>} UnValType;

I>/// Класс сообщения
I>class Message {
I>    public:
I>        DWORD m_dwType;
I>        EnValType m_enValType;
I>        UnValType m_unValue;
I>};
I>

I>Но что-то мне не сильно нравится вариант с union. Может у кого-то была похожая ситуация — поделитесь идеями... Или может даже не стоит пытаться сделать один класс для хранения значений разного типа?
I>Или я в принципе не в ту сторону копаю и обмен сообщениями делается гораздо более по-другому?
I>Спасибо.
все это называется сериализация данных,
вы хотите передавать вместе с данными метаданные (коды типов), можно не мучаться и использовать xml, вроде есть видел
библиотеки для работы с потоком xml в сети (commoncpp2 на дебиновских серваках можно посмотреть), ну а если хочется
своими руками, то ИМХО сделать классы примитивных типов, которые мудут сами себя писать в сокет(Int,Double,String), а потом уже их использовать.
Re[2]: Подкиньте идею как построить класс
От: Dog  
Дата: 22.05.04 12:32
Оценка:
I>>Или я в принципе не в ту сторону копаю и обмен сообщениями делается гораздо более по-другому?
I>>Спасибо.
A>все это называется сериализация данных,
A>вы хотите передавать вместе с данными метаданные (коды типов), можно не мучаться и использовать xml, вроде есть видел
A>библиотеки для работы с потоком xml в сети (commoncpp2 на дебиновских серваках можно посмотреть), ну а если хочется
A>своими руками, то ИМХО сделать классы примитивных типов, которые мудут сами себя писать в сокет(Int,Double,String), а потом уже их использовать.
Тогда уж лучше ACE.
Re[2]: Подкиньте идею как построить класс
От: MaximE Великобритания  
Дата: 22.05.04 13:17
Оценка: +2
achmed wrote:

[]

> все это называется сериализация данных,

> вы хотите передавать вместе с данными метаданные (коды типов), можно не мучаться и использовать xml, вроде есть видел
> библиотеки для работы с потоком xml в сети (commoncpp2 на дебиновских серваках можно посмотреть), ну а если хочется

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

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 alpha
Re[3]: Подкиньте идею как построить класс
От: achmed Удмуртия https://www.linkedin.com/in/nail-achmedzhanov-9907188/
Дата: 22.05.04 13:53
Оценка:
Здравствуйте, Dog, Вы писали:

Dog>Тогда уж лучше ACE.


что такое ACE ?
Re[4]: Подкиньте идею как построить класс
От: Dog  
Дата: 22.05.04 16:48
Оценка:
Dog>>Тогда уж лучше ACE.
A>что такое ACE ?
Библиотека для разработки сетевых прложений. Судя по отзывам на форуме, народ ею доволен.

http://ace.ece.uci.edu/
Так же есть книгана русском (два тома). "Программирование сетевых приложений на C++". Д.Шмидт, С.Хьюстон.
Re[5]: Подкиньте идею как построить класс
От: MaximE Великобритания  
Дата: 22.05.04 17:08
Оценка:
Dog wrote:

> Dog>>Тогда уж лучше ACE.

> A>что такое ACE ?
> Библиотека для разработки сетевых прложений. Судя по отзывам на форуме, народ ею доволен.
>
> http://ace.ece.uci.edu/
> Так же есть книгана русском (два тома). "Программирование сетевых приложений на C++". Д.Шмидт, С.Хьюстон.

ACE — тяжеловесная библиотека, с устаревшим дизайном, которая страдает от собственного наследия.

Книжка — галопом по европам. Откровенно нестоящая.

Я бы обратил внимание на YAMI.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 alpha
Re: Подкиньте идею как построить класс
От: ingvarwolf Канада  
Дата: 23.05.04 16:08
Оценка:
Прошу прощения за долгое отсутствие реакции на ответы, пришлось уехать срочно на пару дней.
Спасибо за советы. Правда брать и изучать какую-то стороннюю библиотеку времени нет, но какие-то идеи я оттуда возьму. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.