Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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
Зачем в такой задаче очередь? Очередь нужна там, где нужна последовательность обработки или синхронизация асинхронно возникающих событий. Здесь вполне можно для каждого клиента выделять отдельный поток и работать с ним в реальном времени. |