powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Программирование работы сервера с множеством клиентов
123 сообщений из 123, показаны все 5 страниц
Программирование работы сервера с множеством клиентов
    #33086079
Фотография lexluther
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет,

Подскажите, пожалуйста, принцип решения следующей задачи,-

У меня есть сетевой TCP/IP сервер и куча TCP/IP клиентов. Мне нужно обеспечить перманентное взаимодействие между клиентами и сервером, при этом клиенты обращаются к серверу беспорядочно.

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

Не хочу ошибиться, и поэтому хотелось бы знать общепринятые способы решения аналогичных проблем (только для мультиплатформенного кода с BSDSockets/WinSocks, без компонентов и иже с ними).

PS: Также подскажите пожалуйста возможна ли мешанина байтов при одновременной посылке данных с разных клиентов на один и тот же сокет, или там действует система очереди.

Заранее спасибо за любой ответ.

С Уважением,
Иванов Артем,
www.cubereality.com
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33086118
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexlutherЯ, допустим, могу решить это за счет либо выделения каждому соединению своего порта

Это делает сокетная библиотека автоматически. У сервера один порт, у каждого клиента свой. Порт клиента назначается автоматически из свободного пула портов, если его не задавать самому. Фактически каждый сокет содержит информацию о номере локального порта и удаленного с его ip-адресом. Идентификация однозначная.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33086183
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lexlutherЯ, допустим, могу решить это за счет либо выделения каждому соединению своего порта,
Ни в коем случае. Сервер слушает ОДИН порт - сколько бы клиентов одновременно не пришло к нему. На каждого клиента сам драйвер протокола TCP/IP будет создавать "соединение" и разбираться какой байт от какого клиента пришел, и кому что отправлять. Обычно, на стороне сервера для каждого клиента создается отдельный процесс который получает на вход уже созданое соединение с клиентом. И каждый процесс общается с клиентом как будто других клиентов несуществует.
Вот эти "соединения" и называются в TCP/IP сокетами.

lexluther либо за счет создания одного управляющего соединения, а другого общего (через какое идут данные с разных сокетов).
В принципе один клиент может приходить к серверу по двум-трем-четырем и тд портам одновременно. Если конечно это нужно :) Но на каждый слушающий порт для каждого из клиентов будет создано одно соединение. Например FTP работает по двум портам, предположим что к серверу пришли пять клиентов - будет создано десять соединений (сокетов).
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33089908
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 Разберитесь с socket API socket(), listen(), accept(), connect() и тд.
2. Напишите два класса ListeningSocket & ConnectedSocket, можно унаследывать их от одного базового MySocket. Или ищите все это на Интернете. Если не хотите зависимосто ит платформы, то Вам нельзя пользоваться всякими WSSoket-ами. Но полная независимость у Вас врядли получится. Поэтому можете использовать интерфейсы interface или абстрактные классы, что в прицыте почти одно и тоже.
3. Создавть отдельный процесс на каждое соединение довольно накладно. Стандартное решение - использовать Thread или как их еще называит потоки. Разберитесь с этим вопросом очень хорошо.
4. Не помешает хорошое знание объектно-ориентированного программирования в C++.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33089977
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzНо полная независимость у Вас врядли получится. Поэтому можете использовать интерфейсы interface или абстрактные классы, что в прицыте почти одно и тоже.


Во всем мире получается без всяких интерфейсов и абстрактных классов на обычном С

AndreiNz
4. Не помешает хорошое знание объектно-ориентированного программирования в C++.

Не имеет отношения к сокетам совсем.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33096050
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С.

На С сейчас, а не двадцать лет назад, пишут в основном только встроенные системы, ну там чайником управлять или пылесосом. Да еще индивидумы, которые не в состоянии осилить разницу между классом и объектом;)

А разница между С и С++ как раз в объектно ориентированном программировании. Это то, что делает С++ лучше, чем С. Поэтому, чем лучше владеешь этими свойсвами языка, тем более эффективные, гибкие и легко поддерживаемые системы создаешь.

Все что я написал, как раз основанно на моем собственном опыте разработки подобных серверов. И это не такая простая задача, которую можно решить простым наскоком. Объектно-ориентированное программирование может существенно упростить ее решение. А вопрос вообще-то был про сервера в целом, а не о сокетах...
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33096089
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzМожно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С.


с++ с тем же успехом является технологией прошлого тысячелетия

AndreiNz
На С сейчас, а не двадцать лет назад, пишут в основном только встроенные системы, ну там чайником управлять или пылесосом.


Не всегда. Если нужно быстродействие, то используют чистый С. Часть сервера, которая отвечает за соединение - это самая критическая часть. Особенно, если количество клиентов, которые могут быть подключены, достаточно велико.

AndreiNz
А разница между С и С++ как раз в объектно ориентированном программировании. Это то, что делает С++ лучше, чем С. Поэтому, чем лучше владеешь этими свойсвами языка, тем более эффективные, гибкие и легко поддерживаемые системы создаешь.


Это верно для бизнес логики, но бессмысленно в данном случае. Тут будет один виток с accept, в котором при соединение будет создаваться новый виток для ослуживания это соединения. Я не вижу повода выпендриваться, что бы доказать свою приверженность ООП.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33096125
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzМожно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С.
Ню-ню... Более хороший значит? Это с каких пор мешанина технологий стала более лучшей чем одна, стройная система?

AndreiNzВсе что я написал, как раз основанно на моем собственном опыте разработки подобных серверов. И это не такая простая задача, которую можно решить простым наскоком.
Да, для С++ это не такая простая задача. А для С - элементарная :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33096484
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер слушает один порт - при подключении очередного клиента открывается клиентский сокет и для работы с клиентом создаётся новый серверный поток управления. По моему совершенно классическая задача, подробно расписанная в любой серьёзной книге по сетевому программированию. Есть хорошая книга "Программирование с сетях Windows 2000". Ещё есть замечательная книженция Программитрование TCP/IP в стандарте posix что ли называется - такая жёлтенькая - из трёхтомной серии ... Валяется где - то в бумажном, если надо могу точно прсмотреть название/авторов - книга крайне полезная для любого программиста, связанного с сокетами.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33096497
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzМожно, конечно и на обычном С написать, только стоит ли скатываться до технологий прошлого тысячелетия? ;) Ведь С++ был разработан как более хороший, читай лучший С. Да и форум этот посвящен С++ а не С.


Приехали... На С тоже можно писать в ООП - стиле и причём тут технологии прошлых тысячилетий не понимаю...


На С сейчас, а не двадцать лет назад, пишут в основном только встроенные системы, ну там чайником управлять или пылесосом. Да еще индивидумы, которые не в состоянии осилить разницу между классом и объектом;)

Не надо строить из всех дураков - всех кого я знаю из программистов чистого С - прекрасные специалистами, чего я бы не сказал про множество разработчиков С# не понимающих толком даже что такое виртуальная таблица ;) Это не касается всех - просто в среднем так выходит...


А разница между С и С++ как раз в объектно ориентированном программировании. Это то, что делает С++ лучше, чем С. Поэтому, чем лучше владеешь этими свойсвами языка, тем более эффективные, гибкие и легко поддерживаемые системы создаешь.


При недостаточно глубоком знании ООП и тонкостей его реализации на текущей платформе ничего хорошего не сделаешь. На С что делаешь то и получаешь - всё предельно прозрачно.


И это не такая простая задача, которую можно решить простым наскоком.


Согласен, хотя не такая и уж сверхсложная


Объектно-ориентированное программирование может существенно упростить ее решение. А вопрос вообще-то был про сервера в целом, а не о сокетах...

Опять ООП приплёл - и опять не к месту:). Разработать граммотную структуру приложения в ООП стиле на порядок сложнее чем в смешанном - процедурный + элементы ООП.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099672
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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). Так что книжки надо читать, тогда и в голове мешанины не будет.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099727
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭто с каких пор мешанина технологий стала более лучшей чем одна, стройная система?

бысренько расшифруем что такое "мешанина понятий" и "стройная система"
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099831
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп
Не всегда. Если нужно быстродействие, то используют чистый С.


Когда нужно быстродействие такие фирмы как Микрософт и Борланд используют ассемблер. Покопайтесь в исходниках и вы найдете немало ассемблерного кода там где должен быть только С. Правда в данном случае о переносимости не говорят. Как бы вам это не нравилось, но ассемблер всегда был, есть и будет эффективнее С в работе с процессором и с памятью. И хотя можно предсказать какой ассемблерный код сгенерирует компилятор, вы не сможете его оптимизировать оперируя командами языка С. Вы так же не сможете указать компилятору какю машинную инструкцию использовать в том или ином случае. Это все привилегия ассемблера.

Ну а теперь о том как мы будем делать сервер. Как вы правильно заметили надо создать виток, только я его буду называть 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
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099874
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNz White Owl
Да, для С++ это не такая простая задача. А для С - элементарная :)

Чушь абсолютная, вы бы хотябы подумали перед тем как писать. Я просто не допускаю, что вы настолько нероффесионал, что способны сделать подобное завление подумавшию Язык С являетсяся подмножеством языка С++. Практически все, что написанно на С может быть включено в текст программы написанной на С++...

Речь не о том, что "круче" - С или С++. Просто данная задача легко решается на обычном чистом С, знаний принципов работы сокетов здесь вполне достаточно. Углубляться в детали ООП и городить огород в виде иерархии классов именно в данной задаче ... Зачем? Т.е. может оно кому будет и полезно, но прописывать это как рецепт... Хм...
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099940
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интегратор
Приехали... На С тоже можно писать в ООП - стиле и причём тут технологии прошлых тысячилетий не понимаю...


Очень хотелось бы посмотреть на примерчик. Ну как, например, в С вы реализуете полиморфизм. Или инкапсуляцию... Ну наследственность, наверно, можно сляпать используя табличные функции..


Не надо строить из всех дураков - всех кого я знаю из программистов чистого С - прекрасные специалистами, чего я бы не сказал про множество разработчиков С# не понимающих толком даже что такое виртуальная таблица ;) Это не касается всех - просто в среднем так выходит...


Не надо обобщать! По-вашему выходит, что С язык хороший, потому, что на нем пишут хорошие специалисты, а вот C# плохой, так как ихние программисты не знают что такое vTable. А как много ваших хороших специалистов знают что такое vTable? Да я понимаю, что оно им не нужно. На самом деле я сам считаю, что С++ лучше шарпа. Уж больно я не люблю, когда за меня кто-то решает, что мне можно делать а чего нельзя.


При недостаточно глубоком знании ООП и тонкостей его реализации на текущей платформе ничего хорошего не сделаешь. На С что делаешь то и получаешь - всё предельно прозрачно.

Опять ООП приплёл - и опять не к месту:). Разработать граммотную структуру приложения в ООП стиле на порядок сложнее чем в смешанном - процедурный + элементы ООП


Так с дуру можно и шею сломать. (Подставте нужное слово). А так в нашей проффессии приходится постоянно учиться новому. И отказ от этого ведет в никуда. Вы просто не сможете в очередной раз найти работу.


Согласен, хотя не такая и уж сверхсложная


А никто и не говорил, что она сверхсложная. Но синхронизацию Thred-ов знать нужно, я уже не говорю о том, что надо понимать, что такое Thread и чем она отличается от процесса.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099963
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 и не должна волновать прикладного программиста.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33099989
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redskin
Речь не о том, что "круче" - С или С++. Просто данная задача легко решается на обычном чистом С, знаний принципов работы сокетов здесь вполне достаточно. Углубляться в детали ООП и городить огород в виде иерархии классов именно в данной задаче ... Зачем? Т.е. может оно кому будет и полезно, но прописывать это как рецепт... Хм...

Во-первых ваша программа будет намного лучше структурированна. А это значит, что расширять и поддерживать ее будет легче. Вы просто не будете скакать по всем фаилам, когда вам нужно будет сделать какое-то изменение.

Во-вторых в ООП гораздо лучше реализуется повторное использование кода (или как это сейчас называется по-русски?).

В-третьих, вы можете использовать библиотеки классов поставляемые с компилятором STL (стандартная библиотека шаблонов) является частью стандарта языка С++ и должна быть в составе любого компилятора претендующего на соответствие стандарту. Плюс MFC и ATL от Микрософта и OWL от Борланда.

В-четвертых в MSDNе есть пример чатовой программы, которая может быть примером для построения подбного сервер, только не переносимого так как они используют serialisation. Но сама идея может быть воплощена в любой системе.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100036
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп,

Тот кто собирается вас пороть просто не понимает объектно-ориентированного программирования. Он наверное где-то его учил, но так и не понял до конца. Оно - это прежде всего абстрации и и строгая привязка поведения к состоянию state and behaviar. Каждый класс должен делать только свою работу и быть независим от других настолько насколько это возможно. В приведенном мною примере полиморфизм как раз и позволяет вам отделить разные классы ответственные за разную специфику работы. Еще более эффективным полиморфизм может быть с сочетании с использованием контейнеров list, vector, dequque, map и тд.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100080
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzЗемлекоп,

Тот кто собирается вас пороть просто не понимает объектно-ориентированного программирования. Он наверное где-то его учил, но так и не понял до конца. Оно - это прежде всего абстрации и и строгая привязка поведения к состоянию state and behaviar. Каждый класс должен делать только свою работу и быть независим от других настолько насколько это возможно. В приведенном мною примере полиморфизм как раз и позволяет вам отделить разные классы ответственные за разную специфику работы.


Тут важнее инкапсуляция, что бы скрыть детали реализации, особенно зависящие от платформы.

AndreiNz
Еще более эффективным полиморфизм может быть с сочетании с использованием контейнеров list, vector, dequque, map и тд.

Я оставлю для комментариев других людей эту умную фразу
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100085
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNz redskin
Речь не о том, что "круче" - С или С++. Просто данная задача легко решается на обычном чистом С, знаний принципов работы сокетов здесь вполне достаточно. Углубляться в детали ООП и городить огород в виде иерархии классов именно в данной задаче ... Зачем? Т.е. может оно кому будет и полезно, но прописывать это как рецепт... Хм...

Во-первых ваша программа будет намного лучше структурированна. А это значит, что расширять и поддерживать ее будет легче. Вы просто не будете скакать по всем фаилам, когда вам нужно будет сделать какое-то изменение.


Мои программы и так ничего себе структурированы, спасибо


Во-вторых в ООП гораздо лучше реализуется повторное использование кода (или как это сейчас называется по-русски?).


Да, это то все понятно, но не думаю, что автор топика рассчитвал на лекцию о плюсах и минусах ООП. Был задан конкретный вопрос (я тоже ничего по теме не написал, так оффтопик и флуд, каюсь :)) и он к ООП имеет мало отношения, согласитесь. Похожие задачи разбираюся в любой серьезной книжке по программированию сетевых приложений, и авторы в них, что характерно, (тот же Стивенс, например) обходились чистым С.

Все остальное - stl, mfc, atl, owl (этот то динозавр каким образом тут всплыл?) к теме имеют весьма опосредованное отношение. Любая технология - это средство, инструмент, а не самоцель. Если разработчик владеет ООП, он сам накрутит классов вокруг сокетов (или использует готовые решения такого типа), если нет, реализует на чистом socket api и тоже будет счастлив...

Говоря проще, я услышав исходный вопрос, посоветую читать Стивенса.
Вы - Буча и Страуструпа....
Чья точка зрения правильней? Не знаю
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100220
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 и тд.


После столь неграммотных заявлений с Вами сложно будет спорить :) Какой связь полиморфизма со стандартными контейнерами вы усмотрели ??? Объясните нам тёмным - будьте добры ...
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100229
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot redskinГоворя проще, я услышав исходный вопрос, посоветую читать Стивенса.
Вы - Буча и Страуструпа....
Чья точка зрения правильней? Не знаю [/quot]

Поддерживаю ! ;)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100528
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас White OwlЭто с каких пор мешанина технологий стала более лучшей чем одна, стройная система?
бысренько расшифруем что такое "мешанина понятий" и "стройная система"
Прошу прощения, но я сказал "мешанина технологий" а не "понятий". Читай внимательнее. С - процедурный язык с макроподстановками. Все.
А современный С++ это смесь процедурного, объектного и макроподстановочного подхода. Плюс возможность использования кусков на чистом С. Имено это я и называю мешаниной технологий.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100796
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
А современный С++ это смесь процедурного, объектного и макроподстановочного подхода. Плюс возможность использования кусков на чистом С. Имено это я и называю мешаниной технологий.

Ну как программист вы хорошо понимаете что возможность мультипарадигмной разработки - это минус для не очень опытного разработчика, так как позволяет слишком много напартачить и большой плюс и дополнительная гибкость для специалиста :). Так что смотря какая задача ;)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100805
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп,

Я, наверное, не совсем понятно объяснил. Вы декларируете абстрактный объект и манипулируете им. А создаете конкретный, зависящий от платфлормы.
Тоесть если вы хотите передать свой объект функции, то вы передаете указатель на CThreadInterface. Например:

void DoSomething( CThreadInterface *pThread){
pThread->Resume();
}

В таком случае потребители вашего объекта не знают как он реализован. Им достаточно знать что это реализованно и только. Единственное место где различие между Windows и Unix реализацией имеет значение - это когда вы создаете объект.

Инкапсуляция не даст вам того уровня абстракции, который даст полиморфизм.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100825
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redskin Любая технология - это средство, инструмент, а не самоцель. Если разработчик владеет ООП, он сам накрутит классов вокруг сокетов (или использует готовые решения такого типа), если нет, реализует на чистом socket api и тоже будет счастлив...


Замечательная фраза ;) На ней можно закончить этот флейм...
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100829
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИнтеграторНу как программист вы хорошо понимаете что возможность мультипарадигмной разработки - это минус для не очень опытного разработчика, так как позволяет слишком много напартачить и большой плюс и дополнительная гибкость для специалиста :).
Все верно. Однако и очень-очень-очень опытному напортачить будет проще :)
Вон пример перед глазами - AndreiNz. Вроде местами он и прав, но руки за такие решения отрывать надо по самые плечи.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100835
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВсе верно. Однако и очень-очень-очень опытному напортачить будет проще :)Вон пример перед глазами - AndreiNz. Вроде местами он и прав, но руки за такие решения отрывать надо по самые плечи.

AndreiNz больше похож на аналиста, теоретика программирования или преподавателя, но не на программиста практика.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33100844
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интегратор, вы хоть представляете, что такое фабрика класса? Это design pattern причем creation pattern. Какая разница, как я создаю объект в простом примере. Фабрика класса только бы усложнила бы этот пример.

Вот где действительно легко наворочить дров, так это воплащая design patterns. Я как раз сейчас работаю в фирме, котора в свое время увлекалась этим делом. Окончилось это тем, что большая часть этих pattern-ов была убранна, потому что жрет очень много ресурсов. Но и сейчас в коде довольно часто встречаются singleton-ны и всякие там observer-ры
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33101252
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzИнтегратор, вы хоть представляете, что такое фабрика класса? Это design pattern причем creation pattern. Какая разница, как я создаю объект в простом примере. Фабрика класса только бы усложнила бы этот пример.

Вот где действительно легко наворочить дров, так это воплащая design patterns. Я как раз сейчас работаю в фирме, котора в свое время увлекалась этим делом. Окончилось это тем, что большая часть этих pattern-ов была убранна, потому что жрет очень много ресурсов. Но и сейчас в коде довольно часто встречаются singleton-ны и всякие там observer-ры

Ну если тупо пихать паттерны везде где можно, как например вы делаете с ООП, то последствия неcложно предугадать Что фирма то производит - очень хочется знать с какой продукцией ни в коем случае нельзя связываться ?

А вот чем вас не устраивает такой код как альтенатива вашему я совсем не понимаю :)
Код: plaintext
1.
2.
 
   shared_ptr<Thread> theThread = ThreadsFactoryHolder::Instance()->create();


PS Честно говоря я бы потоки вообще не в heap-е создавал - посмотрите например как это делаетсчя во всех нормальных либах (тот же boost, ZThreads, wxWindows) :) - но раз уж так вас хочется ...
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33101834
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlПрошу прощения, но я сказал "мешанина технологий"
Прошу прощения, очепятка вышла, действительно, надо хотя бы свои посты внимательнее читать :)

А вобще - чем меньше свободы предоставляет компилятор, тем хуже программисту. А если кому-то не нравится, что что-то есть еще кроме того, что ему нужно и интересно - то никто не заставляет его использовать это в своих проектах.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33104561
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если как альтернатива моему примеру, то абсолютно ни чем не устраивает. Вы наверное полагаете, что фабрика класса сама будет создавать объекты и никакой начинки в ней писать не надо.

Если же серьезно, то внутри метода create() того объекта указатель на который вернет статическая функция Instance() все сведется к тем же #ifdef-ам. Только пример это не сделает более понятным. Вам придется объяснять как работает class factory и приводить текст функции create() как минимум.
А теперь давайте задавать вопросы.

Q: Сократит ли наличие фабрики класса колличество кода, которы надо писать, понимать и поддерживаь?
A: Нет, скорее увеличит.

Q: Улучшит ли наличие фабрики класса повторное использование кода (code reuse)?
A: Ненамного, вы будете создавать thread , по большому счету в двух местах. 1. вы создадите слушающую thread. 2. Вы будете создавать новую thread на каждое новое соединение, но будете делать это в одном и том же месте.

Q: Увеличит ли это эффективность программы?
A: Уменьшит, но не существенно.

Q: Что же тогда улучшит наличие фабрики класса?
A: Элегантность программы.

Q: А на хрена козе баян?

Конечно можно создавать объект как на хипе, так и на стеке, просто я посчитал, что пример с использованием хипа будет более понятным.

Теперь о том, что делает фирма. Она много чего делает. В частности она делает так называемый такую программу. Когда у вас гаснет электричество, вы начинаете звонить тому, кто вам это электричество поставляет. Так вот наш софт позволяет отсортировать огромную массу звонков и пропустить операторам, только те, которые действительно несут полезную информацию. Другой продукт позволяет отслеживать и передавать по радио и каналам мобильной телефонной связи задания на и текущее состояние аванийных и плановых работ в электроэнергетике. Третий позволяет отслеживать местонахождение местонахождение транспортных средст и собирать с них дополнительную информацию(скорость, температуры и тд.).
Компания продает свои продукты в основном в США, Канаду, Австралию, Новую Зеландию. Российских клиентов у нас нет и за рубли мы не торгуем. Более того я, наверное, единственный человек в компании, кто знает, что такое рубль.

Так что, если решите покупать продукцию нашей фирмы, подумайте, может вам стоит купить небольшую электростанцию или всю американскую береговую охрану для начала.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33104604
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreiNz
Инкапсуляция не даст вам того уровня абстракции, который даст полиморфизм.

Можно ссылочку на первоисточник этой глубой мысли?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33104835
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во первых создавать потоки на С++ предложенным вами методом и который я повторил в более адекватной форме - бред. Ещё раз - смотрите хорошие либы - там всё сделано правильно :)

AndreiNz

Если же серьезно, то внутри метода create() того объекта указатель на который вернет статическая функция Instance() все сведется к тем же #ifdef-ам. Только пример это не сделает более понятным.


Сделает. Всё зашито в фабрику - как она делает - неважно для клиентского кода. ifdef-ы что в С что в С++ зашиваются в код библиотеки, то позволяет сделать клиентский код абсолютно прозрачным. В клиентском кодже нет ни упоминания что он адаптируется под ту или иную ОС - за это отвечает используемая либа. Это принципиальный момент - так как вы утверждали что ООп позволяет сделать код в случае кроссплатформы проще. ООП здесь непричём совершенно.


Q: Сократит ли наличие фабрики класса колличество кода, которы надо писать, понимать и поддерживаь?
A: Нет, скорее увеличит.

Да - я задействую стандартную фабрику либо напишу обобщённую сам. Если вы не знаете как это сделать - учите матчасть :)


Q: Улучшит ли наличие фабрики класса повторное использование кода (code reuse)?

Я с вас просто балдею - честное слово. То вы кричите пихайте ООП везде где можно, а то утверждаете что Design Patterns - это зло... Видите ли DP - это не панацея и не магические приёмы которые надо либо использовать либо нет... Если вы дейтсвительно хорошо разбираетесь в ООП и пишете много кода, то у вас эти програмные элементы будут появляться сами собой незвисимо от того прочитади ли вы GoF или нет. Так как паттерны - это прото некоторые хорошо зарекомендовавшиее себя для решения определённых задач программные приёмы, не трюки - а именно приёмы. По крайне мере когда я читал GoF в своё время многие вещи показались очень знакомыми и близкими к реальной практике. Раз вы говорите что то непонятно про эффективность (кстати так и не расшифровав о чём вы говорите), то аподозреваю что вы вообще слабо понимаете что такое паттерны ... По крайней мере утверждение: не пользуйтесь стандартными приёмами звучит довольно странно и дико ...


Q: Увеличит ли это эффективность программы?


ООП вообще почти всегда уменьшает эффективность программы - тогда зачем вы им пользуейтесь вообще ? Вы начинаете противоречить сами себе. То ура ООП - а то давайте писать проще. Вы уж определитесь чего вы хотите пожалуста.


A: Уменьшит, но не существенно.


Возможно что вообще никак не изменит если код будет встраиваемым :).


A: Элегантность программы.

cv. выше.



Конечно можно создавать объект как на хипе, так и на стеке, просто я посчитал, что пример с использованием хипа будет более понятным.

Пример отвратительный так как предназначался для примера хорошего решения здачи, поставленной автором топика, при этом приведённое решение не выдерживает ни малейшей критики.


реклама поскипана...


Более того я, наверное, единственный человек в компании, кто знает, что такое рубль.

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

PS Оффтоп. Лучше бы показывали вашу компетентность качественными примерами кода и объяснениями а не громкими абстракными заявления ;)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33104972
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzЗемлекоп,

Я, наверное, не совсем понятно объяснил. Вы декларируете абстрактный объект и манипулируете им. А создаете конкретный, зависящий от платфлормы.
Тоесть если вы хотите передать свой объект функции, то вы передаете указатель на CThreadInterface. Например:

void DoSomething( CThreadInterface *pThread){
pThread->Resume();
}


А каким образом будет реализовано тело самого витка? Где оно будет объявлено?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105226
prof79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЗемлекопА каким образом будет реализовано тело самого витка? Где оно будет объявлено?
Реализация для Unix будет зашита в классе CThreadUnix
Реализация для винды - в CThreadWindows.
Далее допустим через год Вас напряглим портировать эту систему на MacOS.
Вместо того чтобы ковыряться в исходном коде вы должны будете
а) создать новый класс (CMacOSThread)- поток от CThreadInterface и в нем реализовать логику работы.
б) в одном месте - при создании обьекта (неважно используют фабрику класов или нет - все равно ГДЕТО #ifdef делать придется - программа под Unix попросту не скомпилится с #include<windows.h>) написать
#ifdef _MACOS
pThread = new CMacOSThread;
#endif

И все. Больше ничего(в идеале) трогать не потребуется. Вот вам и преимущества полморфизма над инкапсуляцией если хотите так понимать :-) .
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105242
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
prof79Реализация для Unix будет зашита в классе CThreadUnix
Реализация для винды - в CThreadWindows.


Странный подход. А если логика самого витка почти не зависит от платформы, то для чего плодить повторяющийся код. Это что же за ООП такое?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105273
prof79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кодер
Странный подход. А если логика самого витка почти не зависит от платформы, то для чего плодить повторяющийся код. Это что же за ООП такое?
Значит "почти независящее" вынести в отдельную(ые) ф-цию-член CThreadInterface и вызывать ее по месту требования.
А "зависящее" - раскидать по наследникам.
ЗЫ не принимайте это как совет к действию. Скорее это иллюстрация технологии. Не видя задачи целиком сложно говорить, стОит ли применять эту технологию или легче обойтись чистым С.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105330
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prof79 Кодер
Странный подход. А если логика самого витка почти не зависит от платформы, то для чего плодить повторяющийся код. Это что же за ООП такое?
Значит "почти независящее" вынести в отдельную(ые) ф-цию-член CThreadInterface и вызывать ее по месту требования.
А "зависящее" - раскидать по наследникам.
ЗЫ не принимайте это как совет к действию. Скорее это иллюстрация технологии. Не видя задачи целиком сложно говорить, стОит ли применять эту технологию или легче обойтись чистым С.

Это "технология" ничего объектно-ориентированного в себе не содержит
Чем это отличается от следующего пример ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  #ifdef _UNIX
     beginUnixThread(&threadProc);
  #endif

  #ifdef _WIN32
     beginWinThread(&threadProc);
  #endif

Для меня это суть одно и тоже :)

Хотя ещё раз отмечу - так НЕ пишут в нормальных проектах. Всё зашивается в библиотечные вызовы, разруливающие все проблемы кроссплатформенности внутри себя.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105370
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
prof79 Кодер
Странный подход. А если логика самого витка почти не зависит от платформы, то для чего плодить повторяющийся код. Это что же за ООП такое?
Значит "почти независящее" вынести в отдельную(ые) ф-цию-член CThreadInterface и вызывать ее по месту требования.
А "зависящее" - раскидать по наследникам.
ЗЫ не принимайте это как совет к действию. Скорее это иллюстрация технологии. Не видя задачи целиком сложно говорить, стОит ли применять эту технологию или легче обойтись чистым С.

prof79, вы когда-нибудь витки использовали? Речь идет о методе типа Run в CWinThread в Windows или run() в QThread в Qt. Другими словами я должен иметь некий класс, от которого я могу породить свой собственный реализовав тело витка, которое не будет зависеть от платформы.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105373
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИнтеграторХотя ещё раз отмечу - так НЕ пишут в нормальных проектах. Всё зашивается в библиотечные вызовы, разруливающие все проблемы кроссплатформенности внутри себя.

Подпишусь под каждым словом.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105413
prof79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИнтеграторЭто "технология" ничего объектно-ориентированного в себе не содержит
Чем это отличается от следующего пример ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  #ifdef _UNIX
     beginUnixThread(&threadProc);
  #endif

  #ifdef _WIN32
     beginWinThread(&threadProc);
  #endif

Для меня это суть одно и тоже :)


Эта технология содержит в себе главное "обьектное" - виртуальные ф-ции. И как следствие устраняется необходимость в case-ах(в данном случае - ifdef) во всех местах кроме создания обьекта. На минутку представьте себе: допустим над потоками можно производить операции:
а) начинать (begin)
б) прекращать(stop)
в) изменять приоритет(set_prior)
г) приостанавливать(pause)
д) возобновлять (resume).
Добавьте при желании операции по вкусу. Все операции закодированы в разных местах программы (библиотеки).
В вашем случае это будет выглядеть приблизительно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
  #ifdef _UNIX
     beginUnixThread(&threadProc);
  #endif
  #ifdef _WIN32
     beginWinThread(&threadProc);
  #endif

  #ifdef _UNIX
     stopUnixThread(&threadProc);
  #endif
  #ifdef _WIN32
     stopWinThread(&threadProc);
  #endif

  #ifdef _UNIX
     set_priorUnixThread(&threadProc, prior);
  #endif
  #ifdef _WIN32
     set_priorWinThread(&threadProc, prior);
  #endif

  #ifdef _UNIX
     pauseUnixThread(&threadProc);
  #endif
  #ifdef _WIN32
     pauseWinThread(&threadProc);
  #endif

  #ifdef _UNIX
     resumeUnixThread(&threadProc);
  #endif
  #ifdef _WIN32
     resumeWinThread(&threadProc);
  #endif
Еще раз повторю: все это разнесено по разным модулям и может неоднократно повторяться. При портировании библиотеки под допустим MacOS будет необходимо облазить все модули и в КАЖДОМ случае добавить
Код: plaintext
1.
2.
#ifdef MacOS
....
В моем варианте. все это будет выглядеть приблизительно так:
В одном месте:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  CThreadInterface *t;
  #ifdef _UNIX
     t=new CThreadWindows;
  #endif
  #ifdef _WIN32
     t=new CThreadUnix;
  #endif
ВО всех остальных местах:
Код: plaintext
1.
2.
3.
4.
5.
  t->Start();
  t->Stop();
  t->SetPrior(proir);
  t->Pause();
  t->Resume();
При портировании под MacOS не потребуется всего-ничего написать новый класс и В ОДНОМ МЕСТЕ добавить #ifdef _MacOS t= new CMacOSThread

Нашли 10 отличий? Или по прежнему одно и тоже ?

Интегратор
Хотя ещё раз отмечу - так НЕ пишут в нормальных проектах. Всё зашивается в библиотечные вызовы, разруливающие все проблемы кроссплатформенности внутри себя.
А библиотекам как разруливать внутри себя?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105744
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prof79А библиотекам как разруливать внутри себя?

Вариант номер 1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#ifdef _UNIX
   #define beginThread befinUnixThread
   #define acquireLock acquireLockUnix
...
#ifdef _WIN32
   #define beginThread begnWinThread
   #define acquireLock acquireLockWin
...
#endif

Вариант 2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
typedef struct tagGenericApi {
   PFN1 beginThread; 
   PFN2 acquireLock; 
...
} GenericApi;

void loadWinApi(GenericApi* api) {
  api->beginThread = &BeginWinThread;
  api->acquireLock = &acquireLockWin;
}

void loadUnixApi(GenericApi* api) {
  api->beginThread = &BeginUnixThread;
  api->acquireLock =  &acquireLockUnix;
}

void loadApi(GenericApi* api) {
#ifdef _UNIX
   loadUnixApi(api);
#ifdef _WIN32
   loadWinApi(api);
#endif
}


ну вот хотя бы так....
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105760
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
prof79
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
  #ifdef _UNIX
     beginUnixThread(&threadProc);
  #endif

  #ifdef _WIN32
     beginWinThread(&threadProc);
  #endif

Эта технология содержит в себе главное "обьектное" - виртуальные ф-ции. И как следствие устраняется необходимость в case-ах(в данном случае - ifdef) во всех местах кроме создания обьекта.
Эта, а что мешает титанам ООП-мысли вынести всю условную компиляцию из кода в скрипты сборки? Достаточно сделать один единственный класс CThread. И повторить его в разных исходниках, исходник win32\CThread.cpp, linux\CThread.cpp, bsd\CThread.cpp, mac\CThread.cpp и так далее.... Если есть сильное желание можно сделать им всем общего родителя CAbstractThread или аналогичный интерфейс, но не обязательно. Нафига делать выбор между платформенными реализациями внутри кода??? Вы б еще в рантайме выбирали какой именно класс создавать :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105782
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот кусок кода для .h файла

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#ifdef POSIX
#   include <pthread.h>
    typedef pthread_t THREAD;
    typedef void *THREAD_FUNC;
#   define THREAD_CREATE(tp,fp,ap) (pthread_create((tp),NULL,(fp),(ap)) ? FALSE : TRUE)
#   define THREAD_JOIN(tp)         pthread_join(tp)
#   define THREAD_SELF()           pthread_self()
#   define THREAD_EXIT(sp)         pthread_exit((sp))
#   define THREAD_ERRNO            (errno)

#elif defined WIN32

#   define THREAD_CREATE(tp,fp,ap) \
((*(tp) = (THREAD) _beginthread((fp), 0 ,(void*)(ap))) == (THREAD) - 1  ? FALSE : TRUE)
#   define THREAD_JOIN(tp)         WaitForSingleObject(*(tp), INFINITE)
#   define THREAD_SELF()           GetCurrentThreadId()
#   define THREAD_EXIT(sp)         _endthread()
#   define THREAD_ERRNO           WSAGetLastError()
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33105804
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot White Owl Нафига делать выбор между платформенными реализациями внутри кода??? [/quot]

:) ну можно ещё с инклудами поиграться

Кстати как вариант номер 3 если разрабатываете с нуля всю либу - делаете в обоих либах одинаковые функции и линкуете к проекту либу для той ОС под которую собираете проект :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33106177
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Молодец, AndreiNz !
Так их, так их, ретроградов-приверженцев убогого базового подмножества великого языка С++-са.
Только я бы вам посоветовал открыть новую тему для дальнейшего развития этой идеи.

Да, и еще - про ассемблер ты маленько загнул. Средний современный компилятор, как принято считать, уже давно генерирует код, лучщий по качеству ручного ассемблерного. Так что если и есть вставки - это скорее дань традиции, непереписанные куски.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33106183
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
вы просто либо не все прочитали, либо не понимаете суть проблемы. Если есть умные мысли, то примеры кода в студию.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33106356
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivМолодец, AndreiNz !
Так их, так их, ретроградов-приверженцев убогого базового подмножества великого языка С++-са.

Посмотрите пожалуйста топик - пока большинство утверждений про ООП от AndreiNz было некорректно, а приводимые примеры кода просто удивляли :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33109582
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интегратор,

А Вам не приходило в голову, что ваш вариант 2 как раз является попыткой воплотить в С то, что я предложил в самом начале. Вот, поздравляю, проблему полиморфизма вы худо - бедно решили. Теперь осталось реализовать инкапсуляцию. Главное, не останавливайтесь на достигнутом!

Тоесть, когда я говорю что-то, это вас удивляет, а когда вы говорите тоже самое но другими словами, вас это не удивляет?

Кодер, то что Вы предложили в примере, наверное самый чистый вариант решения данной проблемы в С. Только у него есть один существенный недостаток - он использует макросы. А макросы ужасно неприятны в отладке и к тому же они очень толерантны к глупым ошибкам. Как только Ваши макросы станут посложнее, вы почувствуете эту проблему. Кроме этого макросы не решат проблемы с ассоциированными данными. Так при создании Thread в Windows возвращается HANDLE. Он используется в последующих операциях с этой самой Thread. Что-то подобное должно быть и в UNIXе. Класс обеъдинит вместе данные и операции над ними.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33109667
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzИнтегратор,

А Вам не приходило в голову, что ваш вариант 2 как раз является попыткой воплотить в С то, что я предложил в самом начале.


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


А макросы ужасно неприятны в отладке и к тому же они очень толерантны к глупым ошибкам. Как только Ваши макросы станут посложнее, вы почувствуете эту проблему.


Если вы обратили внимаение то так реализована компиляция в уникоде/без уникода в Сях например - и ничего - проблем пока не встречал. Такое использование макросов вполне нормально.


Кроме этого макросы не решат проблемы с ассоциированными данными.


HANDLE - то же запрятанное что-то что кстати тоже разное в зависимоти от версии винды :). К чему я это - ук тому что передавайте void* как внутреннее состояние в функции.

Короче поставленную автором топика задачу можно и нужно решить хоть на голом С и ООП здесь совершенно не причём - нарвится пользуйся - не нравится - не пользуйся. Проблемы буду в любом случае и где их будет больше - вопрос совершенно не однозначный.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33109693
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreiNz,
Если вас макросы смущают, то темплейты должны быть вообще смертельны
Кстати, что там у нас с уровнем абстракции при инкапсуляции? Я жду, где про это дело можно почитать в интернете и книжках.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33109799
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КодерAndreiNz,
Если вас макросы смущают, то темплейты должны быть вообще смертельны
Кстати, что там у нас с уровнем абстракции при инкапсуляции? Я жду, где про это дело можно почитать в интернете и книжках.

Если AndreiNz хочет пытаться быть последовательным, (хотя после заявлений о паттернах, на вопросы о которых он кстати отказался отвечать, всё может быть :) ) он должен тащится от шаблонов в реализации С# - компилируемые, типобезопасные... и поэтому совершенно убогие и непригодные для метапрограммирования :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33110492
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗемлекопMasterZiv,
вы просто либо не все прочитали, либо не понимаете суть проблемы. Если есть умные мысли, то примеры кода в студию.

У меня мысли есть, и причем, прошу заметить, все мысли гениальные и божественные.

Я прочитал следующее :
автор
Во всем мире получается без всяких интерфейсов и абстрактных классов на обычном С

, более мне читать не нужно - я и так понял суть проблемы.

Так вот, по этому поводу есть две мысли :
0) С++ рулез, С - отстой.
1) В нашем 21 веке, когда есть возможность писать на С++, писать на С просто нелепо и смешно.

Именно поэтому я и поддержал AndreiNz, потому что он прав.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33110510
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
У меня мысли есть, и причем, прошу заметить, все мысли гениальные и божественные.


Не думаю, что под влиянием алкоголя или травки у вас могут быть такие мысли.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33111139
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot MasterZiv
0) С++ рулез, С - отстой.
Именно поэтому я и поддержал AndreiNz, потому что он прав.[/quot]

Во первых я не вижу аргументации, а во вторых переносимы на программы на С++ надругие компиляторы ? Не хотелось бы вас расстраивать - но переносимы с большой натяжкой. Я уж молчу о проблемах с бинарниками на С++ - например при желании поместить объект в dll ... И не приводите в качестве примера COM - полноценных бинарных компонент, реализующий возможности С++ вы не сделаете.


1) В нашем 21 веке, когда есть возможность писать на С++, писать на С просто нелепо и смешно.


В нашем 21 веке когда есть managed код писать на unmanaged C++ просто нелепо и смешно .
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33112997
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала отвечу Крдеру.

Проблемы с макросами обусловленны прежде всего тем, что макросы обрабатывает препроцессор. А темплэйты обрабатываются компилятором. Их иногда еще называют макросами, одобренными компилятором. В связи с этим отладка темплейтов удобнее отладки макросов.

Да, спасибо, что напомнили. Исправляю ошибку.

Полиморфизм обеспечивает более высокий уровень абстракции нежели инкапсуляция. Copyright (c) AndreiNz 2005. All rights reserved. При перепечатке ссылка на данный пост обязательна.

Теперь Интегратору. Вроде бы я пытался отвечать на все ваши вопросы, даже не самые скромные. Видиимо где-то упустил. Не сочтите за труд, повторите, что вы спрашивали у меня про Design patterns а я такой - сякой не ответил. Просто лень перелопачивать весь топик.

Теперь про HANDLE, по вашему посту видно, что вы не совсем понимаете, что это такое. Так вот, когда вы просите Windows создать какой-либо объект (не путать с ООП). Он, если может, делает это и возвращает вам уникальный идентификатор, который вы можете использовать для дальнейших операций с этим объектом. В Win32 это всегда будет 32 константа, а в Win16 (Windows 3.1, WFWG и тд), возможно и 16-ти, но этим я не занимался. Так, если вам, что-либо интересно, вы спрашивайте, я вам многое могу рассказать. Ну например что такое ISR и DPC и зачем они нужны. Или для чего в COM создаются proxy и stab-ы.

Кстати, я тоже хотел бы узнать, чем занимается ваша фирма, только я не буду утверждать, что у нее негодная продукция. Мне воспитание не позволят делать подобные заявленя, без 100% уверенности в правоте подобного заявления. Кстати, сколько вы сами разработали подобных серверов, может у вас есть огромный опыт, а я всего лишь любитель (на фоне вас), который сделал всего два и третий серьезно переделал. Работают ли ваши сервера, где-либо? Спасибо за ответ.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33113018
Кодер
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreiNzСначала отвечу Крдеру.

Проблемы с макросами обусловленны прежде всего тем, что макросы обрабатывает препроцессор. А темплэйты обрабатываются компилятором. Их иногда еще называют макросами, одобренными компилятором. В связи с этим отладка темплейтов удобнее отладки макросов.

Да, спасибо, что напомнили. Исправляю ошибку.

Полиморфизм обеспечивает более высокий уровень абстракции нежели инкапсуляция. Copyright (c) AndreiNz 2005. All rights reserved. При перепечатке ссылка на данный пост обязательна.


Оба объяснения похожи на старый анекдот:
- В Петербурге жить лучше, чем в Москве.
- Чем лучше то?
- Чем в Москве.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33113041
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNz

Теперь Интегратору. Вроде бы я пытался отвечать на все ваши вопросы, даже не самые скромные. Видиимо где-то упустил. Не сочтите за труд, повторите, что вы спрашивали у меня про Design patterns а я такой - сякой не ответил. Просто лень перелопачивать весь топик.


Вы утверждали о каких-то накладных расходах, связанных с DP. Для меня это равносильно утверждению что ООП приводит к накладным расходам. С со вторым вы миритесь, а с первым - нет :) Как это понимать ?


Теперь про HANDLE, по вашему посту видно, что вы не совсем понимаете, что это такое.


HANDLE может быть что угодно - это концепция не Windows, а общий подход инкапсуляции внетренний структуры объекта. Это может быть как просто целое число, являющееся например индексом в некотором массиве указатель на объекты, как и например непосредственно адресом, по которому расположен объект. Соответсвенно handle позволяет программировать на процедурных языках в ООП стиле - вот и всё.


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


А вот тут кстати с удовольствие попутаю с ООП . Виндоус - объектно0ориентированная система и объекты виндоус вполне можно рассматривать как объекты.

Для меня эти два примера кода являются равноценными - да и компилятор сгенерит похожий код - в первом случае он сам передаст состояние объекта, а во вторым - это делаете вы сами
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class MyObject {
   void run(int n);
};

MyObject obj;

obj.run( 123 );

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void* alloc();
void dealloc(void*);
run(void* obj, int n);

void* obj = alloc();
run(obj,  123 );
dealloc(obj);

В Win32 это всегда будет 32 константа, а в Win16 (Windows 3.1, WFWG и тд), возможно и 16-ти, но этим я не занимался. Так, если вам, что-либо интересно, вы спрашивайте, я вам многое могу рассказать. Ну например что такое ISR и DPC и зачем они нужны. Или для чего в COM создаются proxy и stab-ы.


Кстати, я тоже хотел бы узнать, чем занимается ваша фирма, только я не буду утверждать, что у нее негодная продукция.


Системы автоматизации финансовых расчётов.


Кстати, сколько вы сами разработали подобных серверов, может у вас есть огромный опыт, а я всего лишь любитель (на фоне вас), который сделал всего два и третий серьезно переделал.
Работают ли ваши сервера, где-либо? Спасибо за ответ.


Я не считаю их по количеству - надо смотреть что имеено и как вы сделали, можно и 100 сделать. Я сделал 3. Два на скорую руку, второй уже кстати 1.5 лет работает, перезагружался два раза при профилактических работах на сервере. Третий серьёзно переработал и продолжаю перерабатывать. Думаю работы на нём ещё на полгода как минимум хватит.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33113065
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzТеперь про HANDLE, по вашему посту видно, что вы не совсем понимаете, что это такое. Так вот, когда вы просите Windows создать какой-либо объект (не путать с ООП). Он, если может, делает это и возвращает вам уникальный идентификатор, который вы можете использовать для дальнейших операций с этим объектом. В Win32 это всегда будет 32 константа, а в Win16 (Windows 3.1, WFWG и тд), возможно и 16-ти, но этим я не занимался.


HANDLE - это void * . См. winnt.h.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33113233
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп
HANDLE - это void * . См. winnt.h.

Ещё более интересные вещи можно нарыть если покопаться в исходниках например той же 2000-ной винды :) Но на самом деле это не принципиально, главное что handle - это что-то что ассоциируется с некоторой структурой данных о которыой вы ничего не знаете. Ну скажем так: НЕ ДОЛЖНЫ ничего знать ;). Так как если эту структуру передавать не как void* то вы легально сможете менять её как угодно не следуя рекомендациям. Например см. CRITICAL_SECTION ... А вообще это уже оффтоп и я вообще имел в виду не реализацию в винде а пытался донести до AndreiNz что Сишные методики, о которых шла речь прекрасно работают и активно используются во множестве рабочих комерческих проектов.....
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33122775
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интегратор prof79А библиотекам как разруливать внутри себя?

Вариант номер 1

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#ifdef _UNIX
   #define beginThread befinUnixThread
   #define acquireLock acquireLockUnix
...
#ifdef _WIN32
   #define beginThread begnWinThread
   #define acquireLock acquireLockWin
...
#endif

Вариант 2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
typedef struct tagGenericApi {
   PFN1 beginThread; 
   PFN2 acquireLock; 
...
} GenericApi;

void loadWinApi(GenericApi* api) {
  api->beginThread = &BeginWinThread;
  api->acquireLock = &acquireLockWin;
}

void loadUnixApi(GenericApi* api) {
  api->beginThread = &BeginUnixThread;
  api->acquireLock =  &acquireLockUnix;
}
void loadApi(GenericApi* api) {
#ifdef _UNIX
   loadUnixApi(api);
#ifdef _WIN32
   loadWinApi(api);
#endif
}
ну вот хотя бы так....


Смеялся,
Создаем себе проблемы и героически их преодалеваем


Интегратор
Для меня эти два примера кода являются равноценными - да и компилятор сгенерит похожий код - в первом случае он сам передаст состояние объекта, а во вторым - это делаете вы сами

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class MyObject {
   void run(int n);
};

MyObject obj;

obj.run( 123 );

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void* alloc();
void dealloc(void*);
run(void* obj, int n);

void* obj = alloc();
run(obj,  123 );
dealloc(obj);


В Win32 это всегда будет 32 константа, а в Win16 (Windows 3.1, WFWG и тд), возможно и 16-ти, но этим я не занимался. Так, если вам, что-либо интересно, вы спрашивайте, я вам многое могу рассказать. Ну например что такое ISR и DPC и зачем они нужны. Или для чего в COM создаются proxy и stab-ы.


Смеялся еще сильнене,

вставьте между

run(obj, 123);
и
dealloc(obj);

пару сотен строк кода, и пока я буду смеяться дальше,
а вы будете заниматься отладкой(поиском утечки памяти и т.д. и т.п.)

А как насчет глупых ошибок, типа обращения по неверному типу указателя.
Согласитесь человеческий фактор существует всегда.

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

Ну насмешили.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33122778
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТО Интегратор

Ваш стиль ведения проекта напоминает старую поговорку


Два солдата из стройбата заменяют экскаватор.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33122810
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat,

умников тут и без вас хватает. Ваш код в студию, если хотите, что-либо обсуждать.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33122917
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNz1 Разберитесь с socket API socket(), listen(), accept(), connect() и тд.
2. Напишите два класса ListeningSocket & ConnectedSocket, можно унаследывать их от одного базового MySocket. Или ищите все это на Интернете. Если не хотите зависимосто ит платформы, то Вам нельзя пользоваться всякими WSSoket-ами. Но полная независимость у Вас врядли получится. Поэтому можете использовать интерфейсы interface или абстрактные классы, что в прицыте почти одно и тоже.
3. Создавть отдельный процесс на каждое соединение довольно накладно. Стандартное решение - использовать Thread или как их еще называит потоки. Разберитесь с этим вопросом очень хорошо.
4. Не помешает хорошое знание объектно-ориентированного программирования в C++.
Мое изначальное намерине отнюдь не было - ввяызываться в спор о ООП. Однако, из собственного опыта я знаю, что ООП существенно упрощает разработку любых приложений. Прежде всего за счет того, что вы создаете собственные абстракции, с которыми вы сами потом и работаете. Да, нужно владеть этим предметом на достаточно высоком уровне, но это справедливо для любой технологии и любого языка.

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

Само использование этого подхода позволяет вам получить достаточно независимые слои, которые относительно просто соединять как друг с другом так и с новыми элементами.

Я тоже когда-то прошел через отрицание ООП, пока сам не попыталя его мспользовать. Что-то получилось, но полную силу ООП можно почувствовать, когда используешь все возможности данного подхода. А разве это не справедливо для любой технологии?

Да я погорячился, когда сказал, сто Design patterns могут завести куда угодно. Признаю, правильнее было бы сказать, что сдуру можно и шею сломать. Что уже было сказанно мной.

Землекоп,

Попробуйте поиграть с ООП. Начните не с сокетов и Thread-ов, а с бизнес логики. Когда почувствуете вкус и саму идею, тогда можете переходить к сокетам и тд.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33122945
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzПопробуйте поиграть с ООП. Начните не с сокетов и Thread-ов, а с бизнес логики. Когда почувствуете вкус и саму идею, тогда можете переходить к сокетам и тд.

Яйца курицу учат
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33122962
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поскипано..
AndreiNz
Я тоже когда-то прошел через отрицание ООП, пока сам не попыталя его мспользовать.


Так кто же отрицал ООП ??!! Мне кажется что концепции ООП никто в этой ветке особо не оспаривал, спорили с Вашими утверждениями и некорректными и высказываниями... Автор спросил как решить поставленную задачу - ему сказали как, а Вы в ответ на это стали утверждать что тут без ООП никуда... Вот Крамер великолепно обходиться умудрялся (до сих пор его книгу полистываю ;) ). Более современные авторы с ООП пишут совершенно непотребную литературу, а Вы говорите ООП изучайте... Надо концепции общие изучать и подходы, а не зацикливаться на конкретной технологии. Средство не должно быть замоцелью.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33123399
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп,

Так для справки, я профессионально, те за деньги разрабатываю парограммы так, чтобы не соврать 22-23 годика как. Так, что кто яйца, а кто курица, это еще надо посмотреть.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33123400
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интеграторпоскипано..
Автор спросил как решить поставленную задачу - ему сказали как, а Вы в ответ на это стали утверждать что тут без ООП никуда ...

Тоесть по вашему фраза AndreiNz. Не помешает хорошое знание объектно-ориентированного программирования в C++.
означает, что без ООП никуда.

Знаете, мне простительно недопонимание русского языка, так как я на живу в России уже около 9 лет, но вам, вы уж извините...
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33123436
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzЗемлекоп,

Так для справки, я профессионально, те за деньги разрабатываю парограммы так, чтобы не соврать 22-23 годика как. Так, что кто яйца, а кто курица, это еще надо посмотреть.

Сколько же вам лет, дедушка? При таком аттитьюде, я бы больше 23 и не дал бы.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33123502
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNz
Тоесть по вашему фраза AndreiNz. Не помешает хорошое знание объектно-ориентированного программирования в C++.
означает, что без ООП никуда.

Знаете, мне простительно недопонимание русского языка, так как я на живу в России уже около 9 лет, но вам, вы уж извините...

Вы очень серьёзно преувеличили важность ООП для поставленно автором топика задачи. ООП к этой задаче вообще не имеет никакого отношения. Это равносильно утверждению - для этой задачи желательно ещё знание С# ... и т.п. :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33123525
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИнтеграторВы очень серьёзно преувеличили важность ООП для поставленно автором топика задачи. ООП к этой задаче вообще не имеет никакого отношения. Это равносильно утверждению - для этой задачи желательно ещё знание С# ... и т.п. :)

Открою военную тайну. Самое смешное, что такие задачи чаще всего решают люди, которые не особенно вникают в сокеты, ОПП и тд и тп. Им хватает php, perl и тд и тп. Совсем отсталые довольствуются просто html-файлами. WWW - сервер разбирается сам с этими проблемами. Он для этого и был придуман.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33124809
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекопonstat,

умников тут и без вас хватает. Ваш код в студию, если хотите, что-либо обсуждать.


Ну коль вы так хотите пожалуйста, пример API сетевого мультиплексора
(часть моего уже готового проекта).
С удовольствием выслушаю конструктивную критику.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
..................

#define O_SERV  0x01   // server   
#define O_HOST  0x02   // host are resolved 
#define O_PORT  0x04   // port are resolved
#define O_CONN  0x08   // connection established
#define O_OK	0x06   // host and port  parameters are  set
#define O_POOL  0x10   // pool is  master
#define O_RR      0x20   // ready for read
#define O_RW     0x40   // ready for write
#define O_ERR   0X80   //  socket failed

class c_netconn: public c_nettimer   // network  connection
{
int s ; //  socket descriptor
int s_idx;  // pool index
int p_port; // connections port
struct sockaddr_in  s_addr; 
struct hostent  * shost;
char s_status;  // object status    
/*********connections satus description ***************************
                      sets
8765 - in the pool    4321 - server/client  O_SERV
||+-ready for read    ||+---  host          O_HOST
|+--ready for write    |+----  port	    O_PERT
+---                  +-----  connected	   
error flag apears when  operation is attempted and failed.

*******************************************************************/
int max_atempts;  // max attempts( intit by default by  MAXATTEMPT)
int  s_queue;        // 
sbuffs s_rdbuff;     // buffer for read  message
sbuffs s_wrbuff;    // buffer for write message
sbuffs s_statstr;    // string of connection status  |host:port|status|
public:
c_netconn();    //  default cork 
c_netconn(char* f_host, int f_port);
c_netconn(int f_ds);   // servers socket constructor 
virtual ~c_netconn();

bool  pool(int f_num );             // pool is master of this object and destroy it  
	  	    		    // espesially for call by  c_netpool.add(.....)  f_num is index in the pool.

hostent* host(char* f_host=NULL); // set and return host
int   port(char* f_port=NULL);        // set and return port
void  port(int f_port);                   // set port from integer
virtual int   connect();		         // attempt to connect
int   operator()();                       // return  socket descriptor( try to connect when have not done)    
int   fds();                    // the  same  as operator()(); 
virtual int   writemsg(char * f_msg, int f_size); // write message to the socket
virtual int   readmsg( char* f_msg=NULL,  int f_size= 1024  ); // read message from socket  
                                                  //to the internal buffer f_size is an buffer size
                                                   
int   queued();                 // how many  massages have sent but responce did not received
inline char status(){return s_status;};
inline const  int number() const
	{
	    return s_idx;
	};	    
virtual char* stat(); // return statistics string
};

//============================================================================
//
// 	class netconnpool retreive  sockets(descriptors) pool
//	with multiplexing message traffic and provide  async I/O  operations
//
//===========================================================================
class c_netconnpool:public c_nettimer
{
c_netconn* s_conn[MAXCONN]; 
fd_set s_set;                     // mask of descriptors
int s_socs;			//how many live  sockets  is	 there	
int s_current;			// current socket
int s_readyr;                                  // how many sockets is ready to read;
int s_readyw;
int s_sec;			// default sleep in second(select syscall)
int s_usec;			// default sleep in milisecond(select syscall)

public:
         c_netconnpool();
virtual        ~c_netconnpool();

int add(char* f_host, int f_port);    // add connection to the pool
int add(c_netconn* f_conn);           // 
virtual int netconn();			      // make and/or accept connections 
                                                        //create new c_netconn object when 
                                                        //new connection is accepted 
virtual int socket();                               // retrun free socket

int readyr();			      // number  socket is ready for read
//char* stat();                         // gathering statistics for all sockets
virtual  c_netconn*  nextw(int f_idxset= 0 );    // return next socket  from idxset  which is ready to write
virtual  c_netconn*  nextr(int f_idxset= 0 );    // return next socket from  idx_set which is ready  to read;
c_netconn*  first(int f_idxset= 0 );    // first  live socket
};

#endif
(C) onstat- 

Любое копирование и использованине только с согласия автора(onstat-)


Теперь ваша очередь.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33124835
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп
Открою военную тайну. Самое смешное, что такие задачи чаще всего решают люди, которые не особенно вникают в сокеты, ОПП и тд и тп. Им хватает php, perl и тд и тп. Совсем отсталые довольствуются просто html-файлами. WWW - сервер разбирается сам с этими проблемами. Он для этого и был придуман.

Посмотрите на название раздела, он называется C++,
значит подразумемает обсуждение ООП проекта.

Вобщем не нужно съезжать с темы.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33124840
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-С удовольствием выслушаю конструктивную критику.
Теперь ваша очередь.

Для конструктивной критику нужно в вашу проблематику вникуть. А так на первый взягляд мне нотация используемая не очень нравится :) Я например привык к длинным названиям побробным с использованием прописных букв в начале каждлого слова. Но в принципе это дело вкуса ;)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33124925
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-С удовольствием выслушаю конструктивную критику.


А что можно критиковать, если этот кусок вне контекста не имеет смысла. Что есть c_nettimer нам неясно. Где работа с витками не видно. А главное для чего это было сделано, не написали. Еще один выпендреж?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33124975
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Землекоп
Открою военную тайну. Самое смешное, что такие задачи чаще всего решают люди, которые не особенно вникают в сокеты, ОПП и тд и тп. Им хватает php, perl и тд и тп. Совсем отсталые довольствуются просто html-файлами. WWW - сервер разбирается сам с этими проблемами. Он для этого и был придуман.

Посмотрите на название раздела, он называется C++,
значит подразумемает обсуждение ООП проекта.

Вобщем не нужно съезжать с темы.

Вопрос был про общепринятые способы решения аналогичных проблем (только для мультиплатформенного кода с BSDSockets/WinSocks, без компонентов и иже с ними). Я пример нынешнего состояния дел в этой области.
Кстати, в вашем коде есть строчка:

Код: plaintext
c_netconn* s_conn[MAXCONN]; 

А почему вы не воспользовались
Код: plaintext
std::vector<c_netconn *>s_conn
Дабы привнести все прелести С++?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125041
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп onstat-С удовольствием выслушаю конструктивную критику.


А что можно критиковать, если этот кусок вне контекста не имеет смысла. Что есть c_nettimer нам неясно. Где работа с витками не видно. А главное для чего это было сделано, не написали. Еще один выпендреж?

Обьясните мне,что вы подразумеваете по термином виток?
Это наверное спец термин в вашей организации.

В коментариях к классам написано.
c_netconn управляет дескрипторами сокетов и соединениями если
инициализирован как клент.

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

В общем позволяет прикландому програмисту вычитать
сообщение пришедшее по сети из внутренних буферов класса с_netconn.

Метод c_netconnpool::socket() засыпает на период указанный
в
int s_sec; // default sleep in second
int s_usec; // default sleep in milisecond
(по умолчанию одна секунда).
Далее период сна регулируется статистикой прихода новых сообщений.
Просыпается сразуже как только в буфере есть принятое сообщение.

Да кстате этот работает пока только под unix.

Если нужно будет под M$ для прикладного програмиста
интерфейс не поменяется.

Используется в программе маршрутизаторе
XML сообщений.

Полный код вы скоро сможете найти в проекте OpenDSA,
когда он выйдет. Концептуальное обсуждение проекта пока здесь
http://www.sql.ru/forum/actualthread.aspx?tid=185115
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125055
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп onstat- Землекоп
Открою военную тайну. Самое смешное, что такие задачи чаще всего решают люди, которые не особенно вникают в сокеты, ОПП и тд и тп. Им хватает php, perl и тд и тп. Совсем отсталые довольствуются просто html-файлами. WWW - сервер разбирается сам с этими проблемами. Он для этого и был придуман.

Посмотрите на название раздела, он называется C++,
значит подразумемает обсуждение ООП проекта.

Вобщем не нужно съезжать с темы.

Вопрос был про общепринятые способы решения аналогичных проблем (только для мультиплатформенного кода с BSDSockets/WinSocks, без компонентов и иже с ними). Я пример нынешнего состояния дел в этой области.
Кстати, в вашем коде есть строчка:

Код: plaintext
c_netconn* s_conn[MAXCONN]; 

А почему вы не воспользовались
Код: plaintext
std::vector<c_netconn *>s_conn
Дабы привнести все прелести С++?

Я просил конструктивно.

А что есть принципиальная разница?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125085
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
Обьясните мне,что вы подразумеваете по термином виток?
Это наверное спец термин в вашей организации.


Согласен, что локальный сленг. Один из вариантов перевода Thread


onstat-
с_netconnpool пул сетевых соединений с поддержкой
мультиплексирования и асинхронного ввода вывода.


*.cpp глянуть можно?

onstat-
Да кстате этот работает пока только под unix.
Если нужно будет под M$ для прикладного програмиста
интерфейс не поменяется.

Интересно будет посмотреть, что вы будете менять, тк тут как раз спорят в каком месте хранить изменяемые части и как их реализовывать.

onstat-
Полный код вы скоро сможете найти в проекте OpenDSA,
когда он выйдет. Концептуальное обсуждение проекта пока здесь
http://www.sql.ru/forum/actualthread.aspx?tid=185115
Вы только ошибки в каментах поправьте. Многовато. Гляну на весь код, когда появится.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125096
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Я просил конструктивно.

А что есть принципиальная разница?

Так вот из-за подобной разницы тут весь сыр-бор и произошел. А нужно ли заворачивать в классы sockets & threads API?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125127
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп



onstat-
Да кстате этот работает пока только под unix.
Если нужно будет под M$ для прикладного програмиста
интерфейс не поменяется.

Интересно будет посмотреть, что вы будете менять, тк тут как раз спорят в каком месте хранить изменяемые части и как их реализовывать.


А храниться они будут в разных файлах,
и собираться подключаться по принципу как описал AndreiNz
выше.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125141
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-А храниться они будут в разных файлах,
и собираться подключаться по принципу как описал AndreiNz
выше.

Вот тогда мы посмотрим на реализацию и подвергнем резкой критике, если создадите что-нибудь типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#ifdef _UNUX

pThread = new CThreadUnix;

#endif

#ifdef _Windows

PThread = new CThreadWindows;

#endif
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125151
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп wrote:
> Так вот из-за подобной разницы тут весь сыр-бор и произошел. А нужно ли
> заворачивать в классы sockets & threads API?

мне вот нужно.
легко, при необходимости, могу отнаследовать класс и от потокового
класса и от сокетного одновременно, и иметьь работу с сокетом в
отдельном потоке.
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125168
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat
А храниться они будут в разных файлах,
и собираться подключаться по принципу как описал AndreiNz
выше.

Что под этим понимаешь ? если то как предлагал AndreiNz то за такое могут дать по ушам и правильно сделают :)

А вообще читаемоскь кода имхо оставляет желать лучшего.

Object* arr[MAX_PATH]
- опять же надо смотреть. Если arr не отвечает за хранение Object то нормально, если же что то типа


arr = new ConcreteObject();

..
delete arr;

то я б тоже за это по ушам дал :) Только
std::vector<shared_ptr<Object> > arr_;

Вобщем надо смотреть полный код и разбираться
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125170
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k
Землекоп wrote:
> Так вот из-за подобной разницы тут весь сыр-бор и произошел. А нужно ли
> заворачивать в классы sockets & threads API?

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


Создайте структуру, куда занесите необходимые переменные и передайте ее в thread. Далее передавайте структуру при вызове ваших специфических функций в качестве параметра. Будет также легко.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125177
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп wrote:
> alex_k
>
> Землекоп wrote:
> > Так вот из-за подобной разницы тут весь сыр-бор и произошел. А нужно ли
> > заворачивать в классы sockets & threads API?
>
> мне вот нужно.
> легко, при необходимости, могу отнаследовать класс и от потокового
> класса и от сокетного одновременно, и иметьь работу с сокетом в
> отдельном потоке.
>
>
>
> Создайте структуру, куда занесите необходимые переменные и передайте ее
> в thread. Далее передавайте структуру при вызове ваших специфических
> функций в качестве параметра. Будет также легко.
но это разная легкость :-)
мне удобнее думать о любой сущности как о объекте и чтобы синтаксис
языка мне в этом помогал
Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125185
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп onstat-А храниться они будут в разных файлах,
и собираться подключаться по принципу как описал AndreiNz
выше.

Вот тогда мы посмотрим на реализацию и подвергнем резкой критике, если создадите что-нибудь типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#ifdef _UNUX

pThread = new CThreadUnix;

#endif

#ifdef _Windows

PThread = new CThreadWindows;

#endif


Мне не удалось увидеть конструктивной критики
этого подхода.
Так в чем его недостатки?
О достоинствах я знаю.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125192
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k
но это разная легкость :-)
мне удобнее думать о любой сущности как о объекте и чтобы синтаксис
языка мне в этом помогал


Структура, если особенно не углубляться, тот же класс, только члены у структуры по умолчанию public. Разве еще на -> сэкономите внутри класса.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125198
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Мне не удалось увидеть конструктивной критики
этого подхода.
Так в чем его недостатки?
О достоинствах я знаю.

Так мы же вашего подхода не узрели Кусок h-файла для одного класса - не открыл нам завесы мудрых планов.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125247
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп onstat-Мне не удалось увидеть конструктивной критики
этого подхода.
Так в чем его недостатки?
О достоинствах я знаю.

Так мы же вашего подхода не узрели Кусок h-файла для одного класса - не открыл нам завесы мудрых планов.


Так я и вашего подхода в исходниках не видел до сих пор.

Даже на том уровне абстракции, который предоставил я.

Ваш ход .

Потом будем обсуждать.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125262
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Землекоп onstat-Мне не удалось увидеть конструктивной критики
этого подхода.
Так в чем его недостатки?
О достоинствах я знаю.

Так мы же вашего подхода не узрели Кусок h-файла для одного класса - не открыл нам завесы мудрых планов.


Так я и вашего подхода в исходниках не видел до сих пор.

Даже на том уровне абстракции, который предоставил я.

Ваш ход .

Потом будем обсуждать.

Для threads вот мой подход
/topic/187358&pg=2#1604298
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125270
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интегратор Во первых я не вижу аргументации, а во вторых переносимы на программы на С++ надругие компиляторы ? Не хотелось бы вас расстраивать - но переносимы с большой натяжкой. В нашем 21 веке когда есть managed код писать на unmanaged C++ просто нелепо и смешно .

Oracle Database на 28 платформах. Мы у себя пишем софт одновременно на несколько платформ.

А на сколько платформ переносится managed код ? unix ? Mac ?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125284
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepsikOracle Database на 28 платформах. Мы у себя пишем софт одновременно на несколько платформ.

По-моему, Oracle уже почти весь на Java написан. Так это и есть managed код
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125287
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп alex_k
но это разная легкость :-)
мне удобнее думать о любой сущности как о объекте и чтобы синтаксис
языка мне в этом помогал


Структура, если особенно не углубляться, тот же класс, только члены у структуры по умолчанию public. Разве еще на -> сэкономите внутри класса.

Стоемость -> по сравнению со стоимость отладки копейки.

1. В структуре вы не сможете переопределить операции +, -, >,<, == ...
2. Переопределить конструктор копирования.
3. А с чисткой памяти за собой в вашем случае вобще полная ж...
Давно одину и туже память освобождали 2 раза? Сколько искали место кто и где ее освобождает?

Эти преймущества С++ очень тяжело переоценить.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125309
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-1. В структуре вы не сможете переопределить операции +, -, >,<, == ...


В данной задаче нет необходимости

onstat-
2. Переопределить конструктор копирования.


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

onstat-
3. А с чисткой памяти за собой в вашем случае вобще полная ж...
Давно одину и туже память освобождали 2 раза? Сколько искали место кто и где ее освобождает?

В C++ c этим проблем хватает. Блоки памяти, на которые не указывает ни один указатель в программе, не удаляются как в Java.

onstat-
Эти преймущества С++ очень тяжело переоценить.


Так что же вы не используете vector вместо массива
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125315
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Землекоп
Для threads вот мой подход
/topic/187358&pg=2#1604298[/quot]


Код: plaintext
\n\n#ifdef POSIX\n#   include <pthread.h>\n    typedef pthread_t THREAD;\n    typedef void *THREAD_FUNC;\n#   define THREAD_CREATE(tp,fp,ap) (pthread_create((tp),NULL,(fp),(ap)) ? FALSE : TRUE)\n#   define THREAD_JOIN(tp)         pthread_join(tp)\n#   define THREAD_SELF()           pthread_self()\n#   define THREAD_EXIT(sp)         pthread_exit((sp))\n#   define THREAD_ERRNO            (errno)\n\n#elif defined WIN32\n\n#   define THREAD_CREATE(tp,fp,ap) \\\n((*(tp) = (THREAD) _beginthread((fp), 0 ,(void*)(ap))) == (THREAD) - 1  ? FALSE : TRUE)\n#   define THREAD_JOIN(tp)         WaitForSingleObject(*(tp), INFINITE)\n#   define THREAD_SELF()           GetCurrentThreadId()\n#   define THREAD_EXIT(sp)         _endthread()\n#   define THREAD_ERRNO           WSAGetLastError()\n\n

Не увидел ни одного объявления массивов, структур
итд для хранения информации описывающей subj,
Вы же не с одним сокетом работаете.

Без этих обьявлений ваш код - офтопик.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125324
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп


Так что же вы не используете vector вместо массива

[/quot]



Землекоп

В данной задаче нет необходимости



Вы очень противоречивы.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125332
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Землекоп
В C++ c этим проблем хватает. Блоки памяти, на которые не указывает ни один указатель в программе, не удаляются как в Java.
[/quot]

Ну вы даете, почему Ваш код не Java.

Не нужно съзжать в офтопик.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125359
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Не увидел ни одного объявления массивов, структур
итд для хранения информации описывающей subj,
Вы же не с одним сокетом работаете.

Без этих обьявлений ваш код - офтопик.

Неконструктивный наезд. Вы же не постите весь код. Это просто пример. Вся информация у меня хранится в связном списке структур (легко делается без всякого С++) и удаляется при завершении витка. При соединение создается структура параметров, которая передается в thread и заносится в linked list. Я всегда знаю сколько у меня серверных соединений и их состояние.
В принципе, я не обхожусь уж совсем без c++. Для чистых приложений под Windows я использую MFC, а там есть уже готовые классы для сокетов и threads. Для сложных кросплатформенных frontend GUI клиентов частично использую Qt. Свои классы для обертывания сокетов и витков писать не имеет смысла, тк все давноо прописано. Для критических по времени приложений будет лучше С. В любом случае С++ нет встроенных в язык средств синхронизации между threads. Java более подошла бы. Если нужна скорость и простота в разработке сложной системы клиент-сервер, то web server - готовое решение, которое использует большинством разработчиков в этом мире.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125361
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп LepsikOracle Database на 28 платформах. Мы у себя пишем софт одновременно на несколько платформ.

По-моему, Oracle уже почти весь на Java написан. Так это и есть managed код

вас кто-то обманул. на java часть интерфейса и часть ESP.

А сам engine как был на C++ так там и останется. Иначе производительность упадет резко. Да в самом мелкософте большинство как писалось на С++ так и будет. Это же касается IBM, SONY, Corel, Sybase, .......

У нас в компании, а мы обслуживаем около 6 млн. клиентов как писалось на С++ так никто и не думает переходить на managed code.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125362
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп

В C++ c этим проблем хватает. Блоки памяти, на которые не указывает ни один указатель в программе, не удаляются как в Java.



в С++ нет проблем, язык предоставляет инструменты,
и если вы не можете(не хотите ) ими пользоваться это ваши проблемы.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125379
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Вы очень противоречивы.

Это вы противоречивы Вы пытаетесь навязать повальное ООП всюду, но оставляете использование примитивных сишных массивов, даже размер которых изменить нельзя. Скажете, что нет необходимости заменять массив на нечто более сложное, так и об этом же говорю в конкретном случае про sockets&threads
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125386
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Землекоп

В C++ c этим проблем хватает. Блоки памяти, на которые не указывает ни один указатель в программе, не удаляются как в Java.



в С++ нет проблем, язык предоставляет инструменты,
и если вы не можете(не хотите ) ими пользоваться это ваши проблемы.

Они в общем случае не дают гарантии на 100% при сбоях.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125392
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп onstat-Не увидел ни одного объявления массивов, структур
итд для хранения информации описывающей subj,
Вы же не с одним сокетом работаете.

Без этих обьявлений ваш код - офтопик.

Неконструктивный наезд. Вы же не постите весь код. Это просто пример. Вся информация у меня хранится в связном списке структур (легко делается без всякого С++) и удаляется при завершении витка.

При соединение создается структура параметров, которая передается в thread и заносится в linked list. Я всегда знаю сколько у меня серверных соединений и их состояние.

В принципе, я не обхожусь уж совсем без c++. Для чистых приложений под Windows я использую MFC, а там есть уже готовые классы для сокетов и threads. Для сложных кросплатформенных frontend GUI клиентов частично использую Qt.

Свои классы для обертывания сокетов и витков писать не имеет смысла, тк все давноо прописано. Для критических по времени приложений будет лучше С. В любом случае С++ нет встроенных в язык средств синхронизации между threads. Java более подошла бы. Если нужна скорость и простота в разработке сложной системы клиент-сервер,

то web server - готовое решение, которое использует большинством разработчиков в этом мире.

Смеялся, особенно с фразы

Землекоп
В любом случае С++ нет встроенных в язык средств синхронизации между threads


Еще больше смеялся
с доказательства более высокого быстродействия программы
на С чем С++ с использованием библиотек С++.


Конструктива у нас с вами точно не получится,
не вижу смысла зря сотрясать воздух.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125403
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-Конструктива у нас с вами точно не получится,
не вижу смысла зря сотрясать воздух.

Вы используете известный прием форумного общения, когда больше нечего сказать.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125413
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп onstat-Конструктива у нас с вами точно не получится,
не вижу смысла зря сотрясать воздух.

Вы используете известный прием форумного общения, когда больше нечего сказать.

Мне действительно нечего сказать.

Потому что ваши опусы о о более высокой
происводительности программы на С с использованием библиотек С++,
не дают мне возможности вообще что либо сказать, я до сих пор смеюсь.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125421
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Землекоп onstat-Конструктива у нас с вами точно не получится,
не вижу смысла зря сотрясать воздух.

Вы используете известный прием форумного общения, когда больше нечего сказать.

Мне действительно нечего сказать.

Потому что ваши опусы о о более высокой
происводительности программы на С с использованием библиотек С++,
не дают мне возможности вообще что либо сказать, я до сих пор смеюсь.

А что вы можете добавить кроме смеха в подтверждение?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125427
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп
А что вы можете добавить кроме смеха в подтверждение?

Подтверждения чего?
Того что вы не знаете что пишете(не компетентны) ,
или того, что вы противоречивы?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125433
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat- Землекоп
А что вы можете добавить кроме смеха в подтверждение?

Подтверждения чего?
Того что вы не знаете что пишете(не компетентны) ,
или того, что вы противоречивы?

Давайте еще повторите, что у вас вызывает смех и ниже ваши аргументы.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125437
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://]http://lib.ru/SOCFANT/CHAPEK/gazeta.txt
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125441
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125480
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп http://lib.ru/SOCFANT/CHAPEK/gazeta.txt

Спасибо толковая статья.

На протяжении всей беседы вы и ваши колеги
актвно использовали следующие приемы

5,6,7 против ООП концепции, заметьте вы находитесь в форуме по С++.


8,9 В коментариях к вашим исходникам, и переезд на Java,
Когда вас в уличили.

9. Приведения в пример Фамилий и трудов С-гуру,
не раскрывая истинной сути происходящего.

10. Ваш пример с кодом на С на базе библиотек С++.
А также коментарий к вашим исходникам.

11. Касательно любого поста оппонента.

12. Не на того напали.

Теперь по теме, абстагируясь от полемики,
а сказать то нечего.
потому как искренность ваших намерения я пока не раскусил.

з.ы. Добавьте в статью пункт
"провокация путем уступки инициативы в полемике"
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125489
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
10. Ваш пример с кодом на С на базе библиотек С++.
А также коментарий к вашим исходникам.


А что это за пример такой с кодом на С на базе библиотек С++. Где можно посмотреть.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125504
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп

А что это за пример такой
с кодом на С на базе библиотек С++.
Где можно посмотреть.

Землекоп

В принципе, я не обхожусь уж совсем без c++. Для чистых приложений под Windows я использую MFC, а там есть уже готовые классы для сокетов и threads. Для сложных кросплатформенных frontend GUI клиентов частично использую Qt.

Свои классы для обертывания сокетов и витков писать не имеет смысла, тк все давноо прописано.

Для критических по времени приложений будет лучше С.



Примера небыло, были общие фразы
Прокоментируйте пожалуйста это подробнее .
В зависимости от коментария я вам скажу

1. В ничего не понимаете в теме разговора.
2. Противоречивы.
3. Вы не последовательны в изложении мыслей.

Других вариантов просто нет.

Можете самокритично после коментария добавить свои варианты ответа(ов).
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125513
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или это.

п 10 читается между строк.

Землекоп[quot onstat-]Не увидел ни одного объявления массивов, структур
итд для хранения информации описывающей subj,
Вы же не с одним сокетом работаете.

Без этих обьявлений ваш код - офтопик.

Неконструктивный наезд. Вы же не постите весь код. Это просто пример. Вся информация у меня хранится в связном списке структур (легко делается без всякого С++) и удаляется при завершении витка. При соединение создается структура параметров, которая передается в thread и заносится в linked list. Я всегда знаю сколько у меня серверных соединений и их состояние.
В принципе, я не обхожусь уж совсем без c++. Для чистых приложений под Windows я использую MFC, а там есть уже готовые классы для сокетов и threads. Для сложных кросплатформенных frontend GUI клиентов частично использую Qt. Свои классы для обертывания сокетов и витков писать не имеет смысла, тк все давноо прописано. Для критических по времени приложений будет лучше С. В любом случае С++ нет встроенных в язык средств синхронизации между threads. Java более подошла бы. Если нужна скорость и простота в разработке сложной системы клиент-сервер, то web server - готовое решение, которое использует большинством разработчиков в этом мире.[/qute]

что скажете?
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125609
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
onstat-
что скажете?

О чем?

onstat-10. Ваш пример с кодом на С на базе библиотек С++.
А также коментарий к вашим исходникам

Где пример?

onstat-
Примера небыло, были общие фразы


О чем тогда спор?
Я дал пример реального кода для нитей, который работает на Win32 и POSIX. Полную реализацию я сюда постить не буду. Вы вообще не показали, как используете ни сокетный, ни thread API. Кусок некого абстрактного класса с комментариями на английском с кучей ошибок, который имеет большее отношение к некой предметной части, чем к сокетам.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125621
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Землекоп и onstat - может вы ещё подеретёсь ?

Нафлудили на полторы страницы за день :) Давайте почаще приводить примеры кода и аргументы, а то через каждый пост
- ты дурак
- нет ты дурак
- я не дурак - а вот ты - дурак
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33125625
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИнтеграторЗемлекоп и onstat - может вы ещё подеретёсь ?

Нафлудили на полторы страницы за день :) Давайте почаще приводить примеры кода и аргументы, а то через каждый пост
- ты дурак
- нет ты дурак
- я не дурак - а вот ты - дурак


Я onstat не обижал, кстати, и личность его не трогал :)
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33126464
AndreiNz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так Дятишки,

Быстренько книжки перед сном читать.
1. Programming Microsoft Visual ++ Fifth Edition. David. J Kruglinski, George Shepherd and Scot Wingo. Microsoft Press. ISBN 1-57231-857-0. Chapter Thirty-four. Почему не стоит пользоваться Микрософтовскими сокетами.

2. Developerr's Workshop to COM and ATL 3.0. Andrew W. Troelsen. Wordware Publishing ISBN 1-55622-704-3(pb). Пусть название вас не вводит в заблуждение. Первые 70 страниц - это ревью различных подходов к программированию на С++. Да и сновная тема в книжке раскрыта достаточно хорошо. Я еще не видал более хорошего источника информации по ATL. Правда книжка достаточно редкая. Заодно поймете, насколько вы отстали от жизни.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33126553
Фотография Землекоп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дедушка, а своими словами пересказать слабо? а то работы много, что бы еще читать подрывную литературу.
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33126621
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУ нас в компании, а мы обслуживаем около 6 млн. клиентов как писалось на С++ так никто и не думает переходить на managed code.
поинтересовался про managed code
http://hghltd.yandex.com/yandbtm?url=http://proxx.com.ru/dir2/p43.htm&text=managed+code&reqtext=%28managed::67551+%26+code::11135%29//6&dsn=425&d=4185503
______________________________________________
Вы имеете право хранить молчание! Всё что Вы скажете может быть использовано против Вас в суде!
...
Рейтинг: 0 / 0
Программирование работы сервера с множеством клиентов
    #33126648
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreiNzТак Дятишки,

Быстренько книжки перед сном читать.
1. Programming Microsoft Visual ++ Fifth Edition. David. J Kruglinski, George Shepherd and Scot Wingo. Microsoft Press. ISBN 1-57231-857-0. Chapter Thirty-four. Почему не стоит пользоваться Микрософтовскими сокетами.

2. Developerr's Workshop to COM and ATL 3.0. Andrew W. Troelsen. Wordware Publishing ISBN 1-55622-704-3(pb). Пусть название вас не вводит в заблуждение.

В электронном виде есть ?
...
Рейтинг: 0 / 0
123 сообщений из 123, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Программирование работы сервера с множеством клиентов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]