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


Автор: Paradox 2.3.2004, 07:37
Подскажите идею решения. Саму задачу решать не надо (хочу сам) интересны только идейки

Имеется задание на разработку реализации двух интерфейсов - клиента и
сервера. Клиент должен посылать сообщения на сервер и принимать от сервера
сообщения. Сервер должен принимать сообщения от клиентов и рассылать их всем
подключенным к нему клиентам. Клиент подключается к одному серверу.
Интерфейсы клиента и сервера: у сервера метод void message(const char *msg)
принимает сообщения от клиентов, у клиента метод void message(const char *msg)
принимает сообщения от сервера.
Предложите реализацию по данным требованиям.
Учесть возможность расширения функциональности клиента и/или сервера и
возможность изменения реализации клиента и/или сервера.

Автор: DKeN 24.3.2004, 22:55
имеется сокет у сервера, который ожидает подключения(отдельный поток), клиент создает сокет который подключается к серверу, данный сервер подключив клиента, добавлет его в список клиеннтов(массив или список), и отправляет сообщение ему что он подключен.

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

ЗЫ. Поищи в нете исходники чатов...там какраз чаще всего такой принцип применяется...других вариантов помоему нету.

Автор: sergejzr 25.3.2004, 02:23
Если мессага имеет формат XML, можно будет Обьекты на клиентах инициализировать.
То есть передавать значения мемберов обьекта в формате XML.
Или ты другое раширение имел в виду?

Автор: Fantasist 25.3.2004, 20:27
Лучше всего для этого подходят различные схемы создания распределенных объектов, такие как DCOM и CORBA. В принципе и SOAP к ним относиться, но в такой задаче он будет не удобен.

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

Короче, советую CORBA посмотреть.

Автор: DenDen 25.3.2004, 21:42
Если хочешь писать все сам,
то существует такой алгоритм.
С&S на 1 машине(глупо, но для общей идеи сойдет). Существует(либо на диске, либо в адресном пространстве и С(напрямую), К(через дескриптор, пер.окружения, событие итд.)) защищенная очередь сообщений. Формат сообщения:
--Свой идентификатор/
--Дескритор сервера(процесса его)/
--инфа, кот надо передать.
К может обращаться к этой очереди и ставить туда сообщения, процесс(поток) сервера спит,когда сообщение поставлено очередь пинает Сервер, тот выделяет для своих нужд очередь и поток, рассылающий всем инфу. Если при попытке поставить в очередь новый элемент выясняется, что очередь занята(например, Через TryEnterCriticalSection()--адресное пространство то одно), то образуется еще 1 очередь, на которую передается управление по выполнению первой. Пример в принципе рабочий(я парименял его для того, чтобы 200 диффуров решались на 1 компе, когда им это надо и зачем им это надо.) Потом друган развил эту идею до локальной сети(Очередь1 просто брала(Очередь2 посылала через ТСР(????????)) данные из соответсующих портов--небольшой дров под винду98(по-моему, даже без наворотов а на асме.))Используя такой формат.
вОТ. С уважением.





Автор: Fantasist 25.3.2004, 22:23
DenDen
Цитата
DenDenДата 25.3.2004, 18:42


Зачем в такой задаче очередь? Очередь нужна там, где нужна последовательность обработки или синхронизация асинхронно возникающих событий. Здесь вполне можно для каждого клиента выделять отдельный поток и работать с ним в реальном времени.

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