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

Поиск:

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



**


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

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



В общем проблема в том что я никак не могу привыкнуть к объектам, есть несколько функций обработки сетевого трафика: ip, tcp, udp. Начал переводить программу на объекты, функция ip:
получает указатель на буфер и его длину, анализирует ip пакет который предположительно находится в буфере (там может быть не ip), по окончании анализа (дефрагментация, фильтрация, ведение статистики) в зависимости от протокола вызывается функция обработки tcp или udp (могут быть другие).

четко видны характеристики объекта, есть параметры source_ip, destination_ip, другие параметры из заголовка, есть отдельная процедура дефрагментации, процедера фильтрации по ip...
Но нет ни малейшей идеи как перевести это в объект, т.е. я могу запихнуть все функции и переменные в класс, но как связать это с tcp и udp. Я вижу это так же как с функцией только к ней можно обращаться по типу ip.source_ip или ip.defragmenter.sessions(). В общем как связать объекты между собой? (создать сперва объекты tcp и udp и зарегистрировать их как-то в ip, потом при анализе ip решает которому обработчику передать дальнейшее управление?)
Помогите разобраться.
PM MAIL   Вверх
Сыроежка
Дата 29.6.2011, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может быть вам следует создать базовый абстрактный или не абстрактный класс для всех протоколов: ip, tcp, udp. В него запихнуть в виде чисто виртуальных функций общий интерфейс. А затем от этого абстрактного класса создавать производные классы для ip, tcp, udp 
В различные статические функции передавать ссылку или указатель на каокй-нибудь базовый класс, (если он не абстрактный), и вызывать виртуальные функции.
PM MAIL   Вверх
asmdzen
Дата 29.6.2011, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Сыроежка, сечас стек вызова: ip(pbuff, len) -> tcp(pbuff, len), причем при анализе одного пакета ip можно вызвать tcp несколько раз, т.е. ip явно знает кому передать управление, я не могу сделать что то типа analyze которая возвращала бы указатель на буфер и длину.
думаю как-то так:
Код

сlass tcp_class : public analyzator{...
class ip_class : public analyzator{...

tcp_class tcp;
udp_class udp;
ip_class ip;

ip.register_proc(tcp, 6);
ip.register_proc(udp, 17); //теперь ip знает кого вызывать


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


Эксперт
****


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

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



Цитата(asmdzen @  29.6.2011,  18:35 Найти цитируемый пост)
class ip_class : public analyzator{...

наверное, всё-таки udp_class, а не ip_class ?

asmdzen, по той немногочисленной информации, которую ты дал, выглядит вполне нормально.
Если функции обработки tcp_class и udp_class имеют один и тот же интерфейс, так совсем хорошо.
Если же tcp_class возвращает, например, TCPPacket, а udp_class - UDPPacket, то будут проблемы



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


Шустрый
*


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

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



Цитата(asmdzen @  29.6.2011,  18:35 Найти цитируемый пост)
1:
ip.register_proc(tcp, 6);
ip.register_proc(udp, 17); //теперь ip знает кого вызывать


Если бы у вас был базовый класс, то в нем бы была определена функция register_proc( AbstractProtocol &protocol, size_t len );

 тогда бы вы могли ьвызывать ее как

Код

ip.register_proc(tcp_obj, 6 );
ip.register_proc(udp-obj, 17); 


Это сообщение отредактировал(а) Сыроежка - 29.6.2011, 18:51
PM MAIL   Вверх
borisbn
Дата 29.6.2011, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Сыроежка, чот не пойму... у asmdzen, вроде именно так и сделано. нет ?


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


Шустрый
*


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

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



Цитата(borisbn @  29.6.2011,  18:54 Найти цитируемый пост)
Сыроежка, чот не пойму... у asmdzen, вроде именно так и сделано. нет ? 


Может быть если эту функцию сделать статической, (так как в нее передается ссылка на объект) так будет более читаемо?
PM MAIL   Вверх
asmdzen
Дата 29.6.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



Цитата(borisbn @  29.6.2011,  18:47 Найти цитируемый пост)
наверное, всё-таки udp_class, а не ip_class ?

хотел показать что все наследуются от базового класса, т.е. ip в том числе, не знаю пока если так будет правильно, надо будет наверное по уровням их распределить, хотя они все получают как параметры для анализа только буфер. еще сейчас ip сам проверяет какой номер протокола и передает управление нужной функции, наверное писать ip.register_proc(tcp_obj, 6 ); будет не правильно, не смогу этот метож использовать где-то еще, типа сделаю register_proc(base_class next); методом базового класса и очередь анализаторов туда же, просто надо будет переместить проверку номера протокола в tcp и udp (какойто overhead получается, но думаю это не страшно) и изменить
Код

tcp_class tcp;
udp_class udp;
ip_class ip;

на
Код

ip_class ip;
tcp_class tcp(ip);
udp_class udp(ip);

чтоб они знали откуда брать дополнительные параметры.
Цитата(borisbn @  29.6.2011,  18:47 Найти цитируемый пост)
Если же tcp_class возвращает, например, TCPPacket, а udp_class - UDPPacket, то будут проблемы

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

Цитата(borisbn @  29.6.2011,  18:47 Найти цитируемый пост)
выглядит вполне нормально.

то что я хотел прочитать )) Всем спасибо.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




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


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

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