Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка сетевого потока 
:(
    Опции темы
asmdzen
Дата 23.7.2011, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



mes, а будет ли правильно сделать члены этой структуры константными и для изменения делать const_cast? просто я из геттера возвращаю константную ссылку, сет делаю только из одной части программы.
в общем спасибо, у меня сейчас несколько таких классов, пригодилось )
PM MAIL   Вверх
borisbn
Дата 23.7.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 2
Всего: 135



asmdzen, я, конечно, не mes (куда мне), но думаю, это - неправильно
const_cast - штука неприятная. следует её избегать, как чёрт ладана...
Никто не запрещает компилятору поместить переменную, задекларированную как const в память, помеченную "только для чтения"
(я понимаю, что тут попахивает тем самым животным в том самом безвоздушном пространстве, но тем не менее...). Таким образои, при const_cast'е может произойти сексВиолейшн.

ИМХО ( specially for boostcoder ) const_cast нужет только для поддержки старого кода, изменить который ты не можешь, а тебе кровь из носу желательны const'овые выражения


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
mes
Дата 23.7.2011, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(asmdzen @  23.7.2011,  16:33 Найти цитируемый пост)
 а будет ли правильно сделать члены этой структуры константными и для изменения делать const_cast? 

нет.. данные наружу отдавайте как конст, а внутри пусть они остаются не константными..

Добавлено через 4 минуты и 21 секунду
Цитата(borisbn @  23.7.2011,  17:07 Найти цитируемый пост)
ИМХО ( specially for boostcoder ) const_cast нужет только для поддержки старого кода, изменить который ты не можешь, а тебе кровь из носу желательны const'овые выражения 

не только для этого, но действительно он нужен только в _экстремальных_ ситуациях и не стоит его впихивать куда не попади... smile

Добавлено через 6 минут
Цитата(mes @  23.7.2011,  17:13 Найти цитируемый пост)
а внутри пусть они остаются не константными..

внутри - это внутри логического компонента (объекта или группы объектов)



--------------------
PM MAIL WWW   Вверх
asmdzen
Дата 23.7.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



Цитата(borisbn @  23.7.2011,  18:07 Найти цитируемый пост)
я, конечно, не mes (куда мне)

я извиняюсь, никого не хотел обидеть, просто mes это посоветовал - я у него и спросил, конечно спасибо за ответ.
у меня сейчас получается из одной крайности в другую, раньше я никаких констов не использовал, все переменные делал глобальными и весь код мог их свободно изменить, проблема была в том что 1. это "добро" работало только для одного потока, 2. невозможно было отследить кто именно изменил определенную переменную.

идеальным было бы если разные члены структуры могли изменять только метод(ы) какого то класса (наследованного от чего-то или как-то еще помеченного)
Код

struct user{
unsigned long   ip; // может быть изменен только методами класса CIpAnalyzer
std::set<unsigned short>   openedPorts;// может быть изменен только методами классов CUdpAnalyzer и
                                                                 // CTcpAnalyzer для других он const
};



за оффтоп извиняюсь, если решения по этому поводу нет - вопрос снимаю.

Это сообщение отредактировал(а) asmdzen - 23.7.2011, 19:59
PM MAIL   Вверх
boostcoder
Дата 23.7.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



asmdzen, лучше объясни задачу. а то приходится догадываться чего ты хочешь..
PM WWW   Вверх
asmdzen
Дата 23.7.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



boostcoder, рассинхронизация вышла ))
вопрос вдогонку: есть куча маленьких объектов(функций), все они видят какую-то структуру (похожую на ту что я показал), я сделал для них класс родителя в котором и пристроил эту структуру и эти объекты тоже, они обращаются к членам структуры через указатель на родителя который передается с конструктором. проблема заключается в том что извне я не могу обратится к этим объектам (есть методы типа enable/disable) - следует ли сделать структуру где нибудь еще (в одном из этих объектов) и передавать указатель на нее всем другим (будет прямой доступ к объектам) или следует сделать методы типа get для всех объектов которые возвращали бы константную ссылку?
PM MAIL   Вверх
boostcoder
Дата 23.7.2011, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(asmdzen @  23.7.2011,  20:15 Найти цитируемый пост)
объектов(функций)

функции - не объекты!
или же речь о std::function<> или boost::function<> ? или о функциональных объектах?

Цитата(asmdzen @  23.7.2011,  20:15 Найти цитируемый пост)
они обращаются к членам структуры через указатель на родителя который передается с конструктором.

значит все же функциональные объекты ;)

Цитата(asmdzen @  23.7.2011,  20:15 Найти цитируемый пост)
есть куча маленьких объектов(функций), все они видят какую-то структуру (похожую на ту что я показал), я сделал для них класс родителя в котором и пристроил эту структуру и эти объекты тоже, они обращаются к членам структуры через указатель на родителя который передается с конструктором. проблема заключается в том что извне я не могу обратится к этим объектам (есть методы типа enable/disable) - следует ли сделать структуру где нибудь еще (в одном из этих объектов) и передавать указатель на нее всем другим (будет прямой доступ к объектам) или следует сделать методы типа get для всех объектов которые возвращали бы константную ссылку?

покажи кодом. а то долго синхронизироваться будем.

Это сообщение отредактировал(а) boostcoder - 23.7.2011, 20:21
PM WWW   Вверх
asmdzen
Дата 23.7.2011, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



Код

class CAnalyzator
{
public:
   void Register(const CAnalyzator& child){ childAnalyzators.push_back(&child);}
   int AnalyzeNext(const char* pdata, int len)
   {
       for(std::vector<CAnalyzator*>::iterator i = childAnalyzators.begin();
            i != childAnalyzators.end(); ++i){

            int result = *(i).AnalyzePacket(pdata, len)
            if(result  >= 0) return result;
       }
       return -1; // no good packet
    }

   virtual int AnalyzePacket(const char* pdata, int len) = 0;

protected:
   CParrent* parrent;

private:
   std::vector<CAnalyzator*> childAnalyzators;
   
};

class CIpAnalyzer : public CAnalyzator
{
public:
   CIpAnalyzer(CParrent* prnt) : parrent(parrent){}
   virtual int AnalyzePacket(const char* pdata, int len);
};

int CIpAnalyzer::AnalyzePacket(const char* pdata, int len)
{
  int sourceIp = ((IP*)pdata)->saddr;
  parrent->saddr = sourceIp;
  AnalyzeNext(pdata, len);
}
   


class CParrent
{
public:
   int saddr;
   int daddr;
   short sport;
   short dport;
   int seq;

   CParrent()
   {
      CIpAnalyzer ip(this);
      CTcpAnalyzer tcp(this);
      CUdpAnalyzer udp(this);

      ip.Register(tcp);
      ip.Register(udp);
   }

   int AnalyzeIpPacket(const char* pdata, int len){ ip.AnalyzePacket(pdata, len);}
};
   

tcp и udp такие же как ip, только изменяют они sport и dport.

нужен доступ к объектам ip, udp, tcp. хотелось чтоб saddr и daddr мог изменить только объект ip.

Это сообщение отредактировал(а) asmdzen - 23.7.2011, 20:48
PM MAIL   Вверх
boostcoder
Дата 23.7.2011, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



первое, по моему очень разумное предложение - переписать это чудо с использованием boost.signals. получится строчек 7 ;) или boost нельзя использовать?
во вторых - у тебя тут segfault!
Код

   CParrent()
   {
      CIpAnalyzer ip(this);
      CTcpAnalyzer tcp(this);
      CUdpAnalyzer udp(this);
      ip.Register(tcp);
      ip.Register(udp);
   }


метод Register сохраняет адреса в вектор. ну вот зарегал ты эти объекты и покинул конструктор. загадка: адреса каких объектов будут лежать в векторе? ;)


мое предложение - переписать все накер.

Добавлено через 2 минуты и 5 секунд
Цитата(boostcoder @  23.7.2011,  21:04 Найти цитируемый пост)
переписать это чудо с использованием boost.signals. получится строчек 7 ;)

если критична производительность - я бы вместо std::vector и итераций в run-time, использовал boost::fusion::vector и "итерации" в compile-time ;) это как еще один вариант.
PM WWW   Вверх
mes
Дата 23.7.2011, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  23.7.2011,  20:04 Найти цитируемый пост)
если критична производительность - я бы вместо std::vector и итераций в run-time, использовал boost::fusion::vector и "итерации" в compile-time ;) 
 
без комментариев smile 



--------------------
PM MAIL WWW   Вверх
asmdzen
Дата 23.7.2011, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



Цитата(boostcoder @  23.7.2011,  21:04 Найти цитируемый пост)
адреса каких объектов будут лежать в векторе?

ошибочка вышла ) я их через new создаю просто в примере забыл это.

я уже убедился что boost это сила, вот только руки не доходят с ним по ближе познакомится, вот и занимаюсь рукоблудием ))

boost::signal отличная вешь, почитаю.
вот только я думаю или ознакомится с главными частями boost сразу или писать код по старому а то я этот проект никогда не закончу )


Это сообщение отредактировал(а) asmdzen - 23.7.2011, 21:23
PM MAIL   Вверх
boostcoder
Дата 23.7.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(mes @  23.7.2011,  21:16 Найти цитируемый пост)
без комментариев

простите, не понял иронии...

Добавлено @ 21:31
asmdzen, мне архитектура видится такой:
Код

#include <vector>
#include <iostream>

struct base_analizer {
   virtual int AnalyzePacket(const char*, int) const = 0;
};

struct analizers_registry {
   void Register(base_analizer* o) { analizers.push_back(o); }

   int AnalyzeNext(const char* data, int len) {
      for ( std::vector<base_analizer*>::const_iterator it = analizers.begin();
            it != analizers.end();
            ++it )
      {
         (*it)->AnalyzePacket(data, len);
      }
   }

private:
   std::vector<base_analizer*> analizers;
};

struct ip_analizer: base_analizer {
   virtual int AnalyzePacket(const char* data, int len) const {
      std::cout << __PRETTY_FUNCTION__ << ": data = " << data << ", len = " << len << std::endl;
   }
};

struct udp_analizer: base_analizer {
   virtual int AnalyzePacket(const char* data, int len) const {
      std::cout << __PRETTY_FUNCTION__ << ": data = " << data << ", len = " << len << std::endl;
   }
};

int main() {
   analizers_registry reg;
   reg.Register(new ip_analizer);
   reg.Register(new udp_analizer);
   
   char data[] = "12345";
   int res = reg.AnalyzeNext(data, sizeof(data));
}

http://liveworkspace.org/code/08b24c8a76d6...15d901b687f38b4

Это сообщение отредактировал(а) boostcoder - 23.7.2011, 21:41
PM WWW   Вверх
mes
Дата 23.7.2011, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 1
Всего: 250



Цитата(boostcoder @  23.7.2011,  20:19 Найти цитируемый пост)
простите, не понял иронии... 

если быстро : динамический полиморфизм и fusion не совместимы и производительность тут не причем smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 23.7.2011, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 13
Всего: 110



Цитата(mes @  23.7.2011,  21:42 Найти цитируемый пост)
динамический полиморфизм и fusion не совместимы

в том то и дело. зачем динамический полиморфизм, если есть возможность обойтись без него?
итерация по std::vector в любом случае происходит в рантайме. а еще и в придачу динамический полиморфизм. а вызов виртуальной функции дороже чем обыкновенной.
если использовать fusion::vector - то можно использовать статический полиморфизм + никакой итерации в рантайме + никаких виртуальных функций.

или я чего-то не понимаю?...
PM WWW   Вверх
asmdzen
Дата 23.7.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: нет
Всего: 5



boostcoder, опять моя ошибка, не правильно показал пример.
в общем программа работает с сетевым потоком, получает буфер данных (последовательность IP пакетов или еще каких), выжимает из него всю полезную информацию. у каждого объекта анализатора должен быть свой список зарегистрированных анализаторов, например какой-то ip туннелинг типа gre,
регистрирую gre в ip и ip в gre, ip передает свои данные уже без заголовка gre, тот убирает свой заголовок и передает опять ip.

вопрос был в том, следует ли держать все эти объекты в каком-то другом объекте родителе и получать ссылку на них при необходимости или так-же будет нормально  и без родителя (с точки зрения правильного проектирования)
например мне нужно создать объект обработчик данных (CParrent) но который обрабатывал бы только tcp, для этого мне нужно написать еще какой-то механизм передачи флагов в конструктор, типа такие объекты создаются, такие нет, или создаю дефолтный объект потом делаю disable не нужным объектам (жор памяти но зато get не выдаст ошибку при запросе ненужного объекта)

Это сообщение отредактировал(а) asmdzen - 23.7.2011, 21:53
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.