|
|
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Всем привет, Подскажите, пожалуйста, принцип решения следующей задачи,- У меня есть сетевой TCP/IP сервер и куча TCP/IP клиентов. Мне нужно обеспечить перманентное взаимодействие между клиентами и сервером, при этом клиенты обращаются к серверу беспорядочно. Я, допустим, могу решить это за счет либо выделения каждому соединению своего порта, либо за счет создания одного управляющего соединения, а другого общего (через какое идут данные с разных сокетов). Не хочу ошибиться, и поэтому хотелось бы знать общепринятые способы решения аналогичных проблем (только для мультиплатформенного кода с BSDSockets/WinSocks, без компонентов и иже с ними). PS: Также подскажите пожалуйста возможна ли мешанина байтов при одновременной посылке данных с разных клиентов на один и тот же сокет, или там действует система очереди. Заранее спасибо за любой ответ. С Уважением, Иванов Артем, www.cubereality.com ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2005, 18:26 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
lexlutherЯ, допустим, могу решить это за счет либо выделения каждому соединению своего порта Это делает сокетная библиотека автоматически. У сервера один порт, у каждого клиента свой. Порт клиента назначается автоматически из свободного пула портов, если его не задавать самому. Фактически каждый сокет содержит информацию о номере локального порта и удаленного с его ip-адресом. Идентификация однозначная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2005, 18:38 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
lexlutherЯ, допустим, могу решить это за счет либо выделения каждому соединению своего порта, Ни в коем случае. Сервер слушает ОДИН порт - сколько бы клиентов одновременно не пришло к нему. На каждого клиента сам драйвер протокола TCP/IP будет создавать "соединение" и разбираться какой байт от какого клиента пришел, и кому что отправлять. Обычно, на стороне сервера для каждого клиента создается отдельный процесс который получает на вход уже созданое соединение с клиентом. И каждый процесс общается с клиентом как будто других клиентов несуществует. Вот эти "соединения" и называются в TCP/IP сокетами. lexluther либо за счет создания одного управляющего соединения, а другого общего (через какое идут данные с разных сокетов). В принципе один клиент может приходить к серверу по двум-трем-четырем и тд портам одновременно. Если конечно это нужно :) Но на каждый слушающий порт для каждого из клиентов будет создано одно соединение. Например FTP работает по двум портам, предположим что к серверу пришли пять клиентов - будет создано десять соединений (сокетов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.05.2005, 18:58 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
1 Разберитесь с socket API socket(), listen(), accept(), connect() и тд. 2. Напишите два класса ListeningSocket & ConnectedSocket, можно унаследывать их от одного базового MySocket. Или ищите все это на Интернете. Если не хотите зависимосто ит платформы, то Вам нельзя пользоваться всякими WSSoket-ами. Но полная независимость у Вас врядли получится. Поэтому можете использовать интерфейсы interface или абстрактные классы, что в прицыте почти одно и тоже. 3. Создавть отдельный процесс на каждое соединение довольно накладно. Стандартное решение - использовать Thread или как их еще называит потоки. Разберитесь с этим вопросом очень хорошо. 4. Не помешает хорошое знание объектно-ориентированного программирования в C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 09:27 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNzНо полная независимость у Вас врядли получится. Поэтому можете использовать интерфейсы interface или абстрактные классы, что в прицыте почти одно и тоже. Во всем мире получается без всяких интерфейсов и абстрактных классов на обычном С AndreiNz 4. Не помешает хорошое знание объектно-ориентированного программирования в C++. Не имеет отношения к сокетам совсем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.05.2005, 09:55 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Можно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С. На С сейчас, а не двадцать лет назад, пишут в основном только встроенные системы, ну там чайником управлять или пылесосом. Да еще индивидумы, которые не в состоянии осилить разницу между классом и объектом;) А разница между С и С++ как раз в объектно ориентированном программировании. Это то, что делает С++ лучше, чем С. Поэтому, чем лучше владеешь этими свойсвами языка, тем более эффективные, гибкие и легко поддерживаемые системы создаешь. Все что я написал, как раз основанно на моем собственном опыте разработки подобных серверов. И это не такая простая задача, которую можно решить простым наскоком. Объектно-ориентированное программирование может существенно упростить ее решение. А вопрос вообще-то был про сервера в целом, а не о сокетах... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 21:40 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNzМожно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С. с++ с тем же успехом является технологией прошлого тысячелетия AndreiNz На С сейчас, а не двадцать лет назад, пишут в основном только встроенные системы, ну там чайником управлять или пылесосом. Не всегда. Если нужно быстродействие, то используют чистый С. Часть сервера, которая отвечает за соединение - это самая критическая часть. Особенно, если количество клиентов, которые могут быть подключены, достаточно велико. AndreiNz А разница между С и С++ как раз в объектно ориентированном программировании. Это то, что делает С++ лучше, чем С. Поэтому, чем лучше владеешь этими свойсвами языка, тем более эффективные, гибкие и легко поддерживаемые системы создаешь. Это верно для бизнес логики, но бессмысленно в данном случае. Тут будет один виток с accept, в котором при соединение будет создаваться новый виток для ослуживания это соединения. Я не вижу повода выпендриваться, что бы доказать свою приверженность ООП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 22:26 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNzМожно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С. Ню-ню... Более хороший значит? Это с каких пор мешанина технологий стала более лучшей чем одна, стройная система? AndreiNzВсе что я написал, как раз основанно на моем собственном опыте разработки подобных серверов. И это не такая простая задача, которую можно решить простым наскоком. Да, для С++ это не такая простая задача. А для С - элементарная :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 22:56 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Сервер слушает один порт - при подключении очередного клиента открывается клиентский сокет и для работы с клиентом создаётся новый серверный поток управления. По моему совершенно классическая задача, подробно расписанная в любой серьёзной книге по сетевому программированию. Есть хорошая книга "Программирование с сетях Windows 2000". Ещё есть замечательная книженция Программитрование TCP/IP в стандарте posix что ли называется - такая жёлтенькая - из трёхтомной серии ... Валяется где - то в бумажном, если надо могу точно прсмотреть название/авторов - книга крайне полезная для любого программиста, связанного с сокетами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 09:50 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNzМожно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С. Приехали... На С тоже можно писать в ООП - стиле и причём тут технологии прошлых тысячилетий не понимаю... На С сейчас, а не двадцать лет назад, пишут в основном только встроенные системы, ну там чайником управлять или пылесосом. Да еще индивидумы, которые не в состоянии осилить разницу между классом и объектом;) Не надо строить из всех дураков - всех кого я знаю из программистов чистого С - прекрасные специалистами, чего я бы не сказал про множество разработчиков С# не понимающих толком даже что такое виртуальная таблица ;) Это не касается всех - просто в среднем так выходит... А разница между С и С++ как раз в объектно ориентированном программировании. Это то, что делает С++ лучше, чем С. Поэтому, чем лучше владеешь этими свойсвами языка, тем более эффективные, гибкие и легко поддерживаемые системы создаешь. При недостаточно глубоком знании ООП и тонкостей его реализации на текущей платформе ничего хорошего не сделаешь. На С что делаешь то и получаешь - всё предельно прозрачно. И это не такая простая задача, которую можно решить простым наскоком. Согласен, хотя не такая и уж сверхсложная Объектно-ориентированное программирование может существенно упростить ее решение. А вопрос вообще-то был про сервера в целом, а не о сокетах... Опять ООП приплёл - и опять не к месту:). Разработать граммотную структуру приложения в ООП стиле на порядок сложнее чем в смешанном - процедурный + элементы ООП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2005, 09:59 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
White Owl Да, для С++ это не такая простая задача. А для С - элементарная :) Чушь абсолютная, вы бы хотябы подумали перед тем как писать. Я просто не допускаю, что вы настолько нероффесионал, что способны сделать подобное завление подумавшию Язык С являетсяся подмножеством языка С++. Практически все, что написанно на С может быть включено в текст программы написанной на С++. Ну а если уж сильно приспичет то есть синтакс extern C. Так что опустится до уровня С всегда можно. Только вот стоит ли? White Owl Ню-ню... Более хороший значит? Это с каких пор мешанина технологий стала более лучшей чем одна, стройная система? У вас, возможно, это называется мешаниной технологий, а у других это называется прогрессом. И в том, что разработчики языка решили сохранить совместимость с базовым С нет ничего плохого. Как и нет ничего плохого в самом С. Только разработка на нем высоко трудоемка - и это его основной недостаток. А то, что С++ это лучший С сказал не я. Bjarne Stroustrup: C++ is designed to be "a better C," to support data abctruction, and to support object-orientated programming. (The C++ programming language second edition). Так что книжки надо читать, тогда и в голове мешанины не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 13:36 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
White OwlЭто с каких пор мешанина технологий стала более лучшей чем одна, стройная система? бысренько расшифруем что такое "мешанина понятий" и "стройная система" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 13:58 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Землекоп Не всегда. Если нужно быстродействие, то используют чистый С. Когда нужно быстродействие такие фирмы как Микрософт и Борланд используют ассемблер. Покопайтесь в исходниках и вы найдете немало ассемблерного кода там где должен быть только С. Правда в данном случае о переносимости не говорят. Как бы вам это не нравилось, но ассемблер всегда был, есть и будет эффективнее С в работе с процессором и с памятью. И хотя можно предсказать какой ассемблерный код сгенерирует компилятор, вы не сможете его оптимизировать оперируя командами языка С. Вы так же не сможете указать компилятору какю машинную инструкцию использовать в том или ином случае. Это все привилегия ассемблера. Ну а теперь о том как мы будем делать сервер. Как вы правильно заметили надо создать виток, только я его буду называть Thread, как в первоисточнике. Здесь вас и поджидает первая проблемка. Чтобы создать Thread в Windows вам надо вызвать комманду API CreateThread(). В UNIXe эта команда работать явно не будет. Что делает в таком случае программист С? Правильно он начинает вставлять директивы препроцессора #ifdef, #ifndef и тд. Этими директивами будет утыкан весь ваш проэкт и часто будет сложно определить в какой части кода (UNIXовской или Windowsкой) вы находитесь, особенно, если вы будете вызывать подпрограммы. А вы неприменно будете это делать даже в не очень сложном проэкте. Какие опции есть у С++ ника? Он тоже будет пользоваться директивами препроцессора, а как же без этого. Только у него есть возможность сушественно сократить их колличество. Как? Относительно просто. Создаем абстрактный класс CThreadInterface в котором определены функции которые должны воплощать наследники, а сам класс этого делать не должен. Делается это так: class CThreadInterface { public: virtual int Execute() = 0; virtual void Suspend() = 0; virtual void vResume() = 0; . . CThreadInterface(); virtual ~CThreadInterface(); } =0; здесь указывает, что функция не реализуется в данном классе и ее обязанны реализовать наследники. От этого класса наследуете два других: CThreadWindows и CThreadUnix в которых вы создаете и манипулируете Thread так как это положенно делать в UNIX и Windows соответственно. Вся прелесть в том, что специфика теперь разделена в отдельные классы, которые могут и по хорошему должны находиться в разных файлах. У вас больше нет мешанины кода. Каждая функция ассоциированна с классом, имя которого говорит вам с каким вариантом вы работаете. Теперь как использовать данные классы. 1. Создаете указатель (можно создать и ссылку) на базовый класс: CTheadInterface *pThread; затем создаете объект, но уже специфического типа. Абстрактные классы нельзя создавать. Здесь вам пригодятся директивы препроцессора: #ifdef _UNUX pThread = new CThreadUnix; #endif #ifdef _Windows PThread = new CThreadWindows; #endif А манирулируете вы уже указателем pThread->Resume(); pThread->Suspend(); И тд. И это называется полиморфизмом. Таким же образом можно и нужно решать несовместимость API синхронизации Thread-ов, да и сокеты, хотя там и есть общий API, на самом деле лучше реализовать с учетом особенностий реализаций как в UNIX так и в Windows ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 14:25 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNz White Owl Да, для С++ это не такая простая задача. А для С - элементарная :) Чушь абсолютная, вы бы хотябы подумали перед тем как писать. Я просто не допускаю, что вы настолько нероффесионал, что способны сделать подобное завление подумавшию Язык С являетсяся подмножеством языка С++. Практически все, что написанно на С может быть включено в текст программы написанной на С++... Речь не о том, что "круче" - С или С++. Просто данная задача легко решается на обычном чистом С, знаний принципов работы сокетов здесь вполне достаточно. Углубляться в детали ООП и городить огород в виде иерархии классов именно в данной задаче ... Зачем? Т.е. может оно кому будет и полезно, но прописывать это как рецепт... Хм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 14:35 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Интегратор Приехали... На С тоже можно писать в ООП - стиле и причём тут технологии прошлых тысячилетий не понимаю... Очень хотелось бы посмотреть на примерчик. Ну как, например, в С вы реализуете полиморфизм. Или инкапсуляцию... Ну наследственность, наверно, можно сляпать используя табличные функции.. Не надо строить из всех дураков - всех кого я знаю из программистов чистого С - прекрасные специалистами, чего я бы не сказал про множество разработчиков С# не понимающих толком даже что такое виртуальная таблица ;) Это не касается всех - просто в среднем так выходит... Не надо обобщать! По-вашему выходит, что С язык хороший, потому, что на нем пишут хорошие специалисты, а вот C# плохой, так как ихние программисты не знают что такое vTable. А как много ваших хороших специалистов знают что такое vTable? Да я понимаю, что оно им не нужно. На самом деле я сам считаю, что С++ лучше шарпа. Уж больно я не люблю, когда за меня кто-то решает, что мне можно делать а чего нельзя. При недостаточно глубоком знании ООП и тонкостей его реализации на текущей платформе ничего хорошего не сделаешь. На С что делаешь то и получаешь - всё предельно прозрачно. Опять ООП приплёл - и опять не к месту:). Разработать граммотную структуру приложения в ООП стиле на порядок сложнее чем в смешанном - процедурный + элементы ООП Так с дуру можно и шею сломать. (Подставте нужное слово). А так в нашей проффессии приходится постоянно учиться новому. И отказ от этого ведет в никуда. Вы просто не сможете в очередной раз найти работу. Согласен, хотя не такая и уж сверхсложная А никто и не говорил, что она сверхсложная. Но синхронизацию Thred-ов знать нужно, я уже не говорю о том, что надо понимать, что такое Thread и чем она отличается от процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 14:51 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNz Чтобы создать Thread в Windows вам надо вызвать комманду API CreateThread(). В UNIXe эта команда работать явно не будет. Что делает в таком случае программист С? Правильно он начинает вставлять директивы препроцессора #ifdef, #ifndef и тд. Этими директивами будет утыкан весь ваш проэкт и часто будет сложно определить в какой части кода (UNIXовской или Windowsкой) вы находитесь, особенно, если вы будете вызывать подпрограммы. Не весь, а только один .h файл. Я как раз принимаю участие в разработке системы передачи данных, которая должна работать под Linux, Solaris и Win32 платформами. Вместо прямого вызова функции вызывается макрос, который определяется в .h файле в зависимости от платформы. В с-файлах ifdef, редкость, которую изводят при первой возможности. Можно просто прописать библиотеку-прослойку для каждой платформы. И главный модуль писать на API прослойки. AndreiNz #ifdef _UNUX pThread = new CThreadUnix; #endif #ifdef _Windows PThread = new CThreadWindows; #endif Меня бы за такое выпороли. Это сводит на нет все преимущества ООП. В программе должен быть один класс CThread c с методами типа. Реализация уже может содержать ifdef для подключения соотвествующего платформе API и не должна волновать прикладного программиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 15:01 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
redskin Речь не о том, что "круче" - С или С++. Просто данная задача легко решается на обычном чистом С, знаний принципов работы сокетов здесь вполне достаточно. Углубляться в детали ООП и городить огород в виде иерархии классов именно в данной задаче ... Зачем? Т.е. может оно кому будет и полезно, но прописывать это как рецепт... Хм... Во-первых ваша программа будет намного лучше структурированна. А это значит, что расширять и поддерживать ее будет легче. Вы просто не будете скакать по всем фаилам, когда вам нужно будет сделать какое-то изменение. Во-вторых в ООП гораздо лучше реализуется повторное использование кода (или как это сейчас называется по-русски?). В-третьих, вы можете использовать библиотеки классов поставляемые с компилятором STL (стандартная библиотека шаблонов) является частью стандарта языка С++ и должна быть в составе любого компилятора претендующего на соответствие стандарту. Плюс MFC и ATL от Микрософта и OWL от Борланда. В-четвертых в MSDNе есть пример чатовой программы, которая может быть примером для построения подбного сервер, только не переносимого так как они используют serialisation. Но сама идея может быть воплощена в любой системе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 15:08 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Землекоп, Тот кто собирается вас пороть просто не понимает объектно-ориентированного программирования. Он наверное где-то его учил, но так и не понял до конца. Оно - это прежде всего абстрации и и строгая привязка поведения к состоянию state and behaviar. Каждый класс должен делать только свою работу и быть независим от других настолько насколько это возможно. В приведенном мною примере полиморфизм как раз и позволяет вам отделить разные классы ответственные за разную специфику работы. Еще более эффективным полиморфизм может быть с сочетании с использованием контейнеров list, vector, dequque, map и тд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 15:21 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNzЗемлекоп, Тот кто собирается вас пороть просто не понимает объектно-ориентированного программирования. Он наверное где-то его учил, но так и не понял до конца. Оно - это прежде всего абстрации и и строгая привязка поведения к состоянию state and behaviar. Каждый класс должен делать только свою работу и быть независим от других настолько насколько это возможно. В приведенном мною примере полиморфизм как раз и позволяет вам отделить разные классы ответственные за разную специфику работы. Тут важнее инкапсуляция, что бы скрыть детали реализации, особенно зависящие от платформы. AndreiNz Еще более эффективным полиморфизм может быть с сочетании с использованием контейнеров list, vector, dequque, map и тд. Я оставлю для комментариев других людей эту умную фразу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 15:33 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNz redskin Речь не о том, что "круче" - С или С++. Просто данная задача легко решается на обычном чистом С, знаний принципов работы сокетов здесь вполне достаточно. Углубляться в детали ООП и городить огород в виде иерархии классов именно в данной задаче ... Зачем? Т.е. может оно кому будет и полезно, но прописывать это как рецепт... Хм... Во-первых ваша программа будет намного лучше структурированна. А это значит, что расширять и поддерживать ее будет легче. Вы просто не будете скакать по всем фаилам, когда вам нужно будет сделать какое-то изменение. Мои программы и так ничего себе структурированы, спасибо Во-вторых в ООП гораздо лучше реализуется повторное использование кода (или как это сейчас называется по-русски?). Да, это то все понятно, но не думаю, что автор топика рассчитвал на лекцию о плюсах и минусах ООП. Был задан конкретный вопрос (я тоже ничего по теме не написал, так оффтопик и флуд, каюсь :)) и он к ООП имеет мало отношения, согласитесь. Похожие задачи разбираюся в любой серьезной книжке по программированию сетевых приложений, и авторы в них, что характерно, (тот же Стивенс, например) обходились чистым С. Все остальное - stl, mfc, atl, owl (этот то динозавр каким образом тут всплыл?) к теме имеют весьма опосредованное отношение. Любая технология - это средство, инструмент, а не самоцель. Если разработчик владеет ООП, он сам накрутит классов вокруг сокетов (или использует готовые решения такого типа), если нет, реализует на чистом socket api и тоже будет счастлив... Говоря проще, я услышав исходный вопрос, посоветую читать Стивенса. Вы - Буча и Страуструпа.... Чья точка зрения правильней? Не знаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 15:34 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
AndreiNz Не надо обобщать! По-вашему выходит, что С язык хороший, потому, что на нем пишут хорошие специалисты, а вот C# плохой, так как ихние программисты не знают что такое vTable. А как много ваших хороших специалистов знают что такое vTable? Да я понимаю, что оно им не нужно. На самом деле я сам считаю, что С++ лучше шарпа. Уж больно я не люблю, когда за меня кто-то решает, что мне можно делать а чего нельзя. Как раз cпецы по С которых я знаю прекрасно представляют как устроена VTable и почему она именно так устроена. Многоуважаемый - то что вы пишете про ООП - десткий лепет человека недавно освоившего ООП, точнее начавшего осваивать. Думаю что большинство участников этой ветке не хуже вас как минимум знают ООП - просто они как люой разумный человек решают задачу адекватно требованием/объёму работ и времени на решение а не выпендриваются ;). А тепепь поехали #ifdef _UNUX pThread = new CThreadUnix; #endif #ifdef _Windows PThread = new CThreadWindows; #endif для меня это типичный пример программирования в стиле С Если уж хочется показать знание ООП то хотя бы фабрику классов наваял что - ли... Во-первых ваша программа будет намного лучше структурированна. А это значит, что расширять и поддерживать ее будет легче. Вы просто не будете скакать по всем фаилам, когда вам нужно будет сделать какое-то изменение. Блин - да какое имеет отношение ООП к структурировани. проекта ??? ИМожно напартачить бред как с ООП так и без ООП - причём с ООП ошибится гораздо проще. Посмотрите исходники винды на С - прекрасно формленный и хорошо структурированный код в ООП-стиле на голом С :) В-третьих, вы можете использовать библиотеки классов поставляемые с компилятором STL (стандартная библиотека шаблонов) является частью стандарта языка С++ и должна быть в составе любого компилятора претендующего на соответствие стандарту. Плюс MFC и ATL от Микрософта и OWL от Борланда. Елки - палки - опять приехали ! А кто запрещает писать в процедурном стиле и ими пользоваться - не в мультипарадигмости разве сила и гибкость С++ ?! В-четвертых в MSDNе есть пример чатовой программы, которая может быть примером для построения подбного сервер, только не переносимого так как они используют serialisation. Но сама идея может быть воплощена в любой системе. Молодец конечно что ты хнаешь слово serialization, но в инете есть на порядок более удобные для изучения примеры и граммотно сделанные. Еще более эффективным полиморфизм может быть с сочетании с использованием контейнеров list, vector, dequque, map и тд. После столь неграммотных заявлений с Вами сложно будет спорить :) Какой связь полиморфизма со стандартными контейнерами вы усмотрели ??? Объясните нам тёмным - будьте добры ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 16:07 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
[quot redskinГоворя проще, я услышав исходный вопрос, посоветую читать Стивенса. Вы - Буча и Страуструпа.... Чья точка зрения правильней? Не знаю [/quot] Поддерживаю ! ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 16:09 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас White OwlЭто с каких пор мешанина технологий стала более лучшей чем одна, стройная система? бысренько расшифруем что такое "мешанина понятий" и "стройная система" Прошу прощения, но я сказал "мешанина технологий" а не "понятий". Читай внимательнее. С - процедурный язык с макроподстановками. Все. А современный С++ это смесь процедурного, объектного и макроподстановочного подхода. Плюс возможность использования кусков на чистом С. Имено это я и называю мешаниной технологий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 18:02 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
White Owl А современный С++ это смесь процедурного, объектного и макроподстановочного подхода. Плюс возможность использования кусков на чистом С. Имено это я и называю мешаниной технологий. Ну как программист вы хорошо понимаете что возможность мультипарадигмной разработки - это минус для не очень опытного разработчика, так как позволяет слишком много напартачить и большой плюс и дополнительная гибкость для специалиста :). Так что смотря какая задача ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 21:52 |
|
||
|
Программирование работы сервера с множеством клиентов
|
|||
|---|---|---|---|
|
#18+
Землекоп, Я, наверное, не совсем понятно объяснил. Вы декларируете абстрактный объект и манипулируете им. А создаете конкретный, зависящий от платфлормы. Тоесть если вы хотите передать свой объект функции, то вы передаете указатель на CThreadInterface. Например: void DoSomething( CThreadInterface *pThread){ pThread->Resume(); } В таком случае потребители вашего объекта не знают как он реализован. Им достаточно знать что это реализованно и только. Единственное место где различие между Windows и Unix реализацией имеет значение - это когда вы создаете объект. Инкапсуляция не даст вам того уровня абстракции, который даст полиморфизм. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2005, 22:13 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33100080&tid=2033122]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
78ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 429ms |

| 0 / 0 |
