Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > перевод функций на объекты


Автор: asmdzen 29.6.2011, 16:51
В общем проблема в том что я никак не могу привыкнуть к объектам, есть несколько функций обработки сетевого трафика: 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 решает которому обработчику передать дальнейшее управление?)
Помогите разобраться.

Автор: Сыроежка 29.6.2011, 17:44
Может быть вам следует создать базовый абстрактный или не абстрактный класс для всех протоколов: ip, tcp, udp. В него запихнуть в виде чисто виртуальных функций общий интерфейс. А затем от этого абстрактного класса создавать производные классы для ip, tcp, udp 
В различные статические функции передавать ссылку или указатель на каокй-нибудь базовый класс, (если он не абстрактный), и вызывать виртуальные функции.

Автор: asmdzen 29.6.2011, 18:35
Сыроежка, сечас стек вызова: 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 знает кого вызывать


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

Автор: borisbn 29.6.2011, 18:47
Цитата(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, то будут проблемы

Автор: Сыроежка 29.6.2011, 18:51
Цитата(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); 

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

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


Может быть если эту функцию сделать статической, (так как в нее передается ссылка на объект) так будет более читаемо?

Автор: asmdzen 29.6.2011, 19:17
Цитата(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 Найти цитируемый пост)
выглядит вполне нормально.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)