Всем привет!
У меня программа обменивается с другой программой сообщениями по сетке. Сообщения различаются между собой по типу, все типы заданы как:
#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. Может у кого-то была похожая ситуация — поделитесь идеями... Или может даже не стоит пытаться сделать один класс для хранения значений разного типа?
Или я в принципе не в ту сторону копаю и обмен сообщениями делается гораздо более по-другому?
Спасибо.
Здравствуйте, 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), а потом уже их использовать.
achmed wrote:
[]
> все это называется сериализация данных,
> вы хотите передавать вместе с данными метаданные (коды типов), можно не мучаться и использовать xml, вроде есть видел
> библиотеки для работы с потоком xml в сети (commoncpp2 на дебиновских серваках можно посмотреть), ну а если хочется
XML — жутко неэффективный в плане производительности формат. Если производительность во главе, то лучше использовать бинарный формат. Если нет, то и XML сойдет.
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9 alpha
Dog>>Тогда уж лучше ACE.
A>что такое ACE ?
Библиотека для разработки сетевых прложений. Судя по отзывам на форуме, народ ею доволен.
http://ace.ece.uci.edu/
Так же есть книгана русском (два тома). "Программирование сетевых приложений на C++". Д.Шмидт, С.Хьюстон.
Dog wrote:
> Dog>>Тогда уж лучше ACE.
> A>что такое ACE ?
> Библиотека для разработки сетевых прложений. Судя по отзывам на форуме, народ ею доволен.
>
> http://ace.ece.uci.edu/
> Так же есть книгана русском (два тома). "Программирование сетевых приложений на C++". Д.Шмидт, С.Хьюстон.
ACE — тяжеловесная библиотека, с устаревшим дизайном, которая страдает от собственного наследия.
Книжка — галопом по европам. Откровенно нестоящая.
Я бы обратил внимание на
YAMI.
--
Maxim YegorushkinPosted via RSDN NNTP Server 1.9 alpha
Прошу прощения за долгое отсутствие реакции на ответы, пришлось уехать срочно на пару дней.
Спасибо за советы. Правда брать и изучать какую-то стороннюю библиотеку времени нет, но какие-то идеи я оттуда возьму. Спасибо.