|
|
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Мне нужно реализовать трёхуровневый стек протоколов (уровень работы с каналом связи, канальый уровень и прикладонй), который испольуется для опроса подсистемы сбора данных. Хотелось бы реализовать бы так, чтобы можно было меня протокол на каждом уровне независимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 09:24 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Мне нужно реализовать трёхуровневый стек протоколов (уровень работы с каналом связи, канальый уровень и прикладонй), который используется для опроса подсистемы сбора данных. Хотелось бы реализовать набор классов, который бы позволял независимо нменять каждый уровень стека протоколов. Кто-нибудь сталкивался с этой задачей или встречал информацию о том, как лучше решать данную задачу? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 09:30 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Легко. Надо определиться с передачей данных между уровнями. 1) На событиях - проще всего. Здесь только один поток на нижнем уровне. + быстрее доходят данные + не нужны дополнительные потоки - тормозятся все уровни на время обработки событий 2) На буферах (память под мьтексами, трубы, ...). Здесь для каждого уровня поток. + и - все наоборот. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 09:48 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Да, и еще. Чтобы иметь меньшую связность между уровнями, то необходимо, чтобы уровни ходили под интерфейсами. Тогда, допустим, второй уровень, у темя может использовать уровень первый - езернет, rs232, usb, .... Смотря что ему передадут. Добавление 2: Если хочеться еще уменьшить связность (передача/построение нижележащих уровней), то использовать фабрику классов. В этом форуме эта тема (вообще, отсутствие связности между модулями) была обсосана до нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 09:59 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
AkhДа, и еще. Чтобы иметь меньшую связность между уровнями, то необходимо, чтобы уровни ходили под интерфейсами. Тогда, допустим, второй уровень, у темя может использовать уровень первый - езернет, rs232, usb, .... Смотря что ему передадут. Добавление 2: Если хочеться еще уменьшить связность (передача/построение нижележащих уровней), то использовать фабрику классов. В этом форуме эта тема (вообще, отсутствие связности между модулями) была обсосана до нельзя. А ссылку на тему отсутствие связности между модулями можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 10:15 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
А вот на счёт интерфейсов возникают трудности. Допустим на самом нижне уровне протокола может быть последовательный порт, TCP - клиент (вроде два варианта). Мне кажется тружно выделить общий интейрфейс для классов с разными алгоритмами обмена. Например, для нижнего уровня может быть нужна разная конфигурационная информация, например, для последовательного порта одна, для TCP - другая. Можно конечно в интерфейсе для конфигурирования использовать что-то вроде void Configure(string), но а классы, реализующие интерфейс разбируют строку и извелают конфигурационные параметры, но по-моему это не очень красиво. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 10:24 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 AkhДа, и еще. Чтобы иметь меньшую связность между уровнями, то необходимо, чтобы уровни ходили под интерфейсами. Тогда, допустим, второй уровень, у темя может использовать уровень первый - езернет, rs232, usb, .... Смотря что ему передадут. Добавление 2: Если хочеться еще уменьшить связность (передача/построение нижележащих уровней), то использовать фабрику классов. В этом форуме эта тема (вообще, отсутствие связности между модулями) была обсосана до нельзя. А ссылку на тему отсутствие связности между модулями можно? вроде, оно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 10:35 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005А вот на счёт интерфейсов возникают трудности. Допустим на самом нижне уровне протокола может быть последовательный порт, TCP - клиент (вроде два варианта). Мне кажется тружно выделить общий интейрфейс для классов с разными алгоритмами обмена. Например, для нижнего уровня может быть нужна разная конфигурационная информация, например, для последовательного порта одна, для TCP - другая. Можно конечно в интерфейсе для конфигурирования использовать что-то вроде void Configure(string), но а классы, реализующие интерфейс разбируют строку и извелают конфигурационные параметры, но по-моему это не очень красиво. Даже не могу предположить, почемы вы решили идти именно таким подходом? Отчего не предовать путь к конфигурационному файлу или полный путь конфигурационного файла? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 10:37 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Akh OLEG_2005А вот на счёт интерфейсов возникают трудности. Допустим на самом нижне уровне протокола может быть последовательный порт, TCP - клиент (вроде два варианта). Мне кажется тружно выделить общий интейрфейс для классов с разными алгоритмами обмена. Например, для нижнего уровня может быть нужна разная конфигурационная информация, например, для последовательного порта одна, для TCP - другая. Можно конечно в интерфейсе для конфигурирования использовать что-то вроде void Configure(string), но а классы, реализующие интерфейс разбируют строку и извелают конфигурационные параметры, но по-моему это не очень красиво. Даже не могу предположить, почемы вы решили идти именно таким подходом? Отчего не предовать путь к конфигурационному файлу или полный путь конфигурационного файла? Может я не правильно вас понял, но передавать этот путь похож на мой, я передаю методу конфигуирования строку, а вы предлагаете файл. А в чём преимущество? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 10:45 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Можно конечно в интерфейсе для конфигурирования использовать что-то вроде void Configure(string), но а классы, реализующие интерфейс разбируют строку и извелают конфигурационные параметры, но по-моему это не очень красиво. Вы не правы на счет "красивости". Можно стандартизировать формат строки, которая передается. Файлы, которые реализуют интерфейс временно (в конструкторе, допустим) создадут объект разбора строки с методами допустим Код: plaintext 1. 2. Ну, и если параметры могут иметь одинаковые названия или имеет место необходимость строгой последовательности, то добавить следующие методы: Код: plaintext 1. 2. 3. 4. Классы уровней, скормят строку этому объекту, высосут из него что им надо, и будут дальше работать, как будто им передали эти параметры прямо в конструкторе. Т.о. мы добавляем еще одну абстракцию - а именно, абстакцию от передаваемых параметров потомкам интерфейсов. Дальше можно развить эту мысль: Во первых, мы можем и другие методы интерфейсов параметризировать подобным образом, если они идеологически различаются по семантике. А теперь, внимание, мы вводим инкапсуляцию параметров: Мы расширяем это класс, для ввода параметров. Т.е. вызывающий код передает в этот класс параметры, а класс их сохраняет. Потом передаем уровням ссылки на класс, а класс их от туда вытаскивает. Ну, а теперь пару слов в защиту этого метода: Может возникнуть вопрос, что нам может быть не удобно хранить информацию о этих параметрах в вызывающих классах. Но на самом деле это не так. Вызывающий класс (GUI, например), как раз и знает эти параметры. Он создает нужный ему физический уровень, и он то как раз должен знать о параметрах этого уровня. Было бы странно, если бы он знал, что он хочет создать tcp-уровень, но не знать на каком порту и т.д. :) И еще одно дополнение: В данном случае, мы имеем один минус - некая потеря типизации. Но если класс параметров использовать как базовый, а потом от него наследовать конкретные типы для передачи параметров, то в некотом роде, типизация у нас остается. Вот, собственно, и вся идея. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 10:51 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 Akh OLEG_2005А вот на счёт интерфейсов возникают трудности. Допустим на самом нижне уровне протокола может быть последовательный порт, TCP - клиент (вроде два варианта). Мне кажется тружно выделить общий интейрфейс для классов с разными алгоритмами обмена. Например, для нижнего уровня может быть нужна разная конфигурационная информация, например, для последовательного порта одна, для TCP - другая. Можно конечно в интерфейсе для конфигурирования использовать что-то вроде void Configure(string), но а классы, реализующие интерфейс разбируют строку и извелают конфигурационные параметры, но по-моему это не очень красиво. Даже не могу предположить, почемы вы решили идти именно таким подходом? Отчего не предовать путь к конфигурационному файлу или полный путь конфигурационного файла? Может я не правильно вас понял, но передавать этот путь похож на мой, я передаю методу конфигуирования строку, а вы предлагаете файл. А в чём преимущество? Похож. Разные методы обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 11:03 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
AkhЛегко. Надо определиться с передачей данных между уровнями. 1) На событиях - проще всего. Здесь только один поток на нижнем уровне. + быстрее доходят данные + не нужны дополнительные потоки - тормозятся все уровни на время обработки событий 2) На буферах (память под мьтексами, трубы, ...). Здесь для каждого уровня поток. + и - все наоборот. :) Когда ты говоришь о первом варианте, ты имеешь в виду что-то вроде этого? Каждый уровень имеет указатель на интерфейс соседнего уровня, на нижнем уровене создаётся поток, которые кидает данные в канал связи, при возникновении событий в этом потоке по цепочке данные идут между уровнями? //***Самый нижный уровень, отвечающий за передачу данных в канал связи class IChannelLayer; class IApplicationLayer; class IPhysicalLayer { public: bool Start(); bool Stop(); void SetChannelLayer(IChannelLayer* channelLayer) //Пристёгиваем к канальный уровень { _channelLayer = channnelLayer; } virtual void OnDataReceived(char byte) { _channelLayer->OnReceive(char byte); } private: IChannelLayer* _channelLayer; //Указатель на интерфейс канального уровеня static DWORD WINAPI CommunicationThread(LPVOID param);//Поток обмена, из которого вызываются событиями по уровням }; //*****Канальный уровень (средний уровень) принимает пакеты данных и обменивается данными с прикладным уровнем class IChannelLayer { public: void AttachLayers(IPhysicalLayer* physycalLayer,IApplicationLayer* applicationLayer); virtual void OnReceive(char byte);//Получен очередной символ от физического уровня virtual void OnSent();//Очередной пакет передан virtual void IndicateToApplicationLayer()//Индицируем о каманде для прикладного уровня { _applicationLayer->Indication(); } virtual void RequestDataFromApplicationLayer()//Запрашиваем данные с прикладного уровня { _applicationLayer->GiveDataForChannelLayer(); } private: IPhysicalLayer* _physicalLayer;//Указатель на интерфейс физического уровня IApplicationLayer* _applicationLayer;//Указатель на интерфейс прикодного уровня }; //********Прикладной уровень (верхний уровень) ****** class IApplicationLayer { public: virtual void GiveDataForChannelLayer(); virtual void Indication(); void AttachChannelLayer(IChannelLayer* channelLayer); //Прицепить канальный уровень, с которым он взаимодействует private: IChannelLayer *_channelLayer;//Указатель на интерфейс канального уровня }; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 11:58 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Скажите пожалуйста, а что вы имеете в виду при реализации второго варианта. Как я понял на каждом уровне стека создаётся по одному потоку и обмен происходит через общие буферы, доступ к которым надо синхронизировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:04 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 AkhЛегко. Надо определиться с передачей данных между уровнями. 1) На событиях - проще всего. Здесь только один поток на нижнем уровне. + быстрее доходят данные + не нужны дополнительные потоки - тормозятся все уровни на время обработки событий 2) На буферах (память под мьтексами, трубы, ...). Здесь для каждого уровня поток. + и - все наоборот. :) Когда ты говоришь о первом варианте, ты имеешь в виду что-то вроде этого? Каждый уровень имеет указатель на интерфейс соседнего уровня, на нижнем уровене создаётся поток, которые кидает данные в канал связи, при возникновении событий в этом потоке по цепочке данные идут между уровнями? да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:06 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005Скажите пожалуйста, а что вы имеете в виду при реализации второго варианта. Как я понял на каждом уровне стека создаётся по одному потоку и обмен происходит через общие буферы, доступ к которым надо синхронизировать? Например, если стравнить с реализаций, того что вы выше написали (наверное, самая простая), то будет то же самое, но уровням не надо знать про объекты их использующие. Они у себя накапливают, и их данные заберут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:09 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Akh OLEG_2005Скажите пожалуйста, а что вы имеете в виду при реализации второго варианта. Как я понял на каждом уровне стека создаётся по одному потоку и обмен происходит через общие буферы, доступ к которым надо синхронизировать? Например, если стравнить с реализаций, того что вы выше написали (наверное, самая простая), то будет то же самое, но уровням не надо знать про объекты их использующие. Они у себя накапливают, и их данные заберут. Не знаю даже что лучше, чтобы каждый уровень знал об уровне их использующих или классы уровне знали общих буферах, из которох берутся данные. Во втором случае нарушается инкапсуляция буферов, через которые происходит обмен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:19 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 Akh OLEG_2005Скажите пожалуйста, а что вы имеете в виду при реализации второго варианта. Как я понял на каждом уровне стека создаётся по одному потоку и обмен происходит через общие буферы, доступ к которым надо синхронизировать? Например, если стравнить с реализаций, того что вы выше написали (наверное, самая простая), то будет то же самое, но уровням не надо знать про объекты их использующие. Они у себя накапливают, и их данные заберут. Не знаю даже что лучше, чтобы каждый уровень знал об уровне их использующих или классы уровне знали общих буферах, из которох берутся данные. Во втором случае нарушается инкапсуляция буферов, через которые происходит обмен. Ну, есстественно, предоствить методы вычитки из буферов, которые как раз и будут решать проблемы синхронизации к ним доступа. Что лучше - тебе решать. Если хочешь, можешь написать менеджера, которому будут сливаться все данные, и у которого они будут браться. Так вообще, уровни друг про друга и знать не будут. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:21 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
Этот менеджер, так же может и реализовать схему "на событиях". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:22 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
AkhЭтот менеджер, так же может и реализовать схему "на событиях". Т.е. уровни вместо ссылок друг на друга содержать ссылкии на менеждер, а менеждер имеет ссылки на уровни и скрывает взаимодействие между ними? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:31 |
|
||
|
стек протоколов
|
|||
|---|---|---|---|
|
#18+
OLEG_2005 AkhЭтот менеджер, так же может и реализовать схему "на событиях". Т.е. уровни вместо ссылок друг на друга содержать ссылкии на менеждер, а менеждер имеет ссылки на уровни и скрывает взаимодействие между ними? ага. Идентифицировать уровни по константам например. Я мол хочу отправить пакет уровню 5. или Я уровень 3 кладу пакет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.05.2007, 12:53 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34528950&tid=2028869]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
152ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 519ms |

| 0 / 0 |
