![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Paradox |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1135 Регистрация: 18.11.2002 Где: Россия Репутация: нет Всего: 1 |
Подскажите идею решения. Саму задачу решать не надо (хочу сам) интересны только идейки
Имеется задание на разработку реализации двух интерфейсов - клиента и сервера. Клиент должен посылать сообщения на сервер и принимать от сервера сообщения. Сервер должен принимать сообщения от клиентов и рассылать их всем подключенным к нему клиентам. Клиент подключается к одному серверу. Интерфейсы клиента и сервера: у сервера метод void message(const char *msg) принимает сообщения от клиентов, у клиента метод void message(const char *msg) принимает сообщения от сервера. Предложите реализацию по данным требованиям. Учесть возможность расширения функциональности клиента и/или сервера и возможность изменения реализации клиента и/или сервера. -------------------- --- |
|||
|
||||
DKeN |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 24.3.2004 Репутация: нет Всего: нет |
имеется сокет у сервера, который ожидает подключения(отдельный поток), клиент создает сокет который подключается к серверу, данный сервер подключив клиента, добавлет его в список клиеннтов(массив или список), и отправляет сообщение ему что он подключен.
клиент послал сообщение, сервер получив его, пересылает его клиентам которые в его списке. ЗЫ. Поищи в нете исходники чатов...там какраз чаще всего такой принцип применяется...других вариантов помоему нету. |
|||
|
||||
sergejzr |
|
|||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
Если мессага имеет формат XML, можно будет Обьекты на клиентах инициализировать.
То есть передавать значения мемберов обьекта в формате XML. Или ты другое раширение имел в виду? |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Лучше всего для этого подходят различные схемы создания распределенных объектов, такие как DCOM и CORBA. В принципе и SOAP к ним относиться, но в такой задаче он будет не удобен.
Как я выяснил на собственном опыте, не так уж сложно написать собственную систему распределенных объектов. Смысл в том, чтобы передать клиетну интерфейс (это может быть указатель на интерфейс на сервере) и придумать схему кодирования вызовов методов. Потом клиент кодирует вызов (по правильному это называется маршалинг) в один пакет, туда же запихивает и полученный от сервера интерфейс - и все это дело переправляет серверу. Сервер декодирует пакет (демаршалинг), понимает что за метод надо вызвать и его вызывает. Потом таким же образом переправляет ответ. Короче, советую CORBA посмотреть. -------------------- Волны гасят ветер... |
|||
|
||||
DenDen |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Если хочешь писать все сам,
то существует такой алгоритм. С&S на 1 машине(глупо, но для общей идеи сойдет). Существует(либо на диске, либо в адресном пространстве и С(напрямую), К(через дескриптор, пер.окружения, событие итд.)) защищенная очередь сообщений. Формат сообщения: --Свой идентификатор/ --Дескритор сервера(процесса его)/ --инфа, кот надо передать. К может обращаться к этой очереди и ставить туда сообщения, процесс(поток) сервера спит,когда сообщение поставлено очередь пинает Сервер, тот выделяет для своих нужд очередь и поток, рассылающий всем инфу. Если при попытке поставить в очередь новый элемент выясняется, что очередь занята(например, Через TryEnterCriticalSection()--адресное пространство то одно), то образуется еще 1 очередь, на которую передается управление по выполнению первой. Пример в принципе рабочий(я парименял его для того, чтобы 200 диффуров решались на 1 компе, когда им это надо и зачем им это надо.) Потом друган развил эту идею до локальной сети(Очередь1 просто брала(Очередь2 посылала через ТСР(????????)) данные из соответсующих портов--небольшой дров под винду98(по-моему, даже без наворотов а на асме.))Используя такой формат. вОТ. С уважением. |
|||
|
||||
Fantasist |
|
|||
![]() Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
DenDen
Зачем в такой задаче очередь? Очередь нужна там, где нужна последовательность обработки или синхронизация асинхронно возникающих событий. Здесь вполне можно для каждого клиента выделять отдельный поток и работать с ним в реальном времени. -------------------- Волны гасят ветер... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |