Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.05.2008, 17:26   #1
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию Клиент-серверное приложение: Callback

Здравствуйте. Необходимы советы в решении следующей задачи.
Разработать клиент-серверное приложение и реализовать на его основе системный шаблон синхронизации под названием Callback.
Суть работы данного шаблона такова:
Есть сервер и есть много клиентов. Клиенты постоянно отправляют запросы на сервер, указывая в запросе информацию для обратной связи (тоесть чтобы сервер мог отправить результат запроса обратно нужному клиенту).
//-----------------------------------------------------------------------
Вот с чего я начал.
Есть три класса. Сервер, Клиент, Обработчик.
Сервер хранит очередь запросов (реализуется с помощью stl'овского List) и обрабатывает эти запросы согласно очереди.
Клиент имеет свой номер и какую-то переменную (чтобы получать результат запроса с сервера и выводит на экран результат запроса). Свой номер он отправляет серверу в качестве информации для обратной связи.
Обработчик хранит две очереди: очередь запросов клиентов и очередь ответов сервера. Из первой очереди он отправляет запросы на сервер, а из второй - клиентам.
//----------------------------------------------------------------------
Вопрос заключается в следующем: через какой объект синхронизации это все дело лучше всего организовать? Ну чтобы ярче было видно, что запросы отправляются и приходят ответы. Я думаю сделать для каждого объекта свой тип потока. Тоесть для сервера - серверный поток, для обработчика (или лучше его назвать распределитель) - поток обработчика, для клиентов - потоки-клиенты.
//----------------------------------------------------------------------
Среда разработки Borland C++ Builder 6.
MaTBeu вне форума Ответить с цитированием
Старый 31.05.2008, 18:09   #2
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

я немного не понял, что ты имеешь ввиду под словом callback. сокетовская модель ввода/вывода, которая называется Completion routines? или обычный backconnect?
насчет организации, да, потоки самое оно. но это зависит от того, какую модель i/o будешь использовать. лично мне нравится WSAAsyncSelect, простая, понятная и удобная) для меня самое оно, т.к мне нравится wtl, там сообщения ловить удобно)
vvviperrr вне форума Ответить с цитированием
Старый 31.05.2008, 18:21   #3
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Нет, мне свой обработчик сообщений (распределитель) сделать нужно. Тоесть стандартными средствами, на основе потоков. Это скорее похоже на backconnect, только в качестве сообщений идут обычные числа.
MaTBeu вне форума Ответить с цитированием
Старый 31.05.2008, 18:28   #4
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

ну говоря ловить сообщения я имел ввиду fd_accept, fd_read, fd_write и тп. ты какие сокеты используешь? блокирующие? тогда тебе понадобится создавать для каждого подключенного клиента отдельный поток, что не айс, если у тебя много клиентов будет. (хотя я так делал, работает норм).
пс. а что пишешь то?)
vvviperrr вне форума Ответить с цитированием
Старый 31.05.2008, 18:39   #5
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Сокетами тут и не пахнет Просто нужно смоделировать обмен сообщениями клиентов и сервера с помощью системного шаблона синхронизации Callback. Тоесть мне просто потоки синхронизировать нужно. Никаких сокетов. Простая прога с классами и потоками.
MaTBeu вне форума Ответить с цитированием
Старый 31.05.2008, 18:58   #6
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

аа. понятно просто у мну клиент-сервер сразу ассоциируется с сетью)
vvviperrr вне форума Ответить с цитированием
Старый 31.05.2008, 19:16   #7
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Я вот так прикинул... Лучше всего будет сделать это через семафор с двумя местами. Одно место всегда занято обработчиком, а второе попеременно то у сервера, то у клиента.
Только вот как сделать на Билдере семафор... ума не приложу.
MaTBeu вне форума Ответить с цитированием
Старый 31.05.2008, 19:34   #8
vvviperrr
Тупой студент
Форумчанин
 
Аватар для vvviperrr
 
Регистрация: 12.05.2007
Сообщений: 614
По умолчанию

эм. объекты синхронизации я всегда создавал апишными функциями. семафор - CreateSemaphore. так что нет привязки к среде разработки. пс. в мсдн есть пример
vvviperrr вне форума Ответить с цитированием
Старый 31.05.2008, 19:49   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Отлично надо будет посмотреть, когда закончу с классами. Спасибо.
MaTBeu вне форума Ответить с цитированием
Старый 01.06.2008, 12:05   #10
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Итак, снова здравствуйте. Вопрос мой вот в чем. Я написал класс Semaphore на апишных функциях. А так как с WinAPI я не сильно в друзьях, то у меня мой семафор не работает. Подскажите пожалуйста что не так
Код:
#include <windows.h>
//---------------------------------------------------------------------------

class MySemaphore
{
        public:
                MySemaphore(long, long);
                void uOpenSemaphore();
                bool uReleaseSemaphore(long, long);
        private:
                HANDLE Semaphore;
};
//---------------------------------------------------------------------------
MySemaphore::MySemaphore(long InitialCount, long MaximumCount)
{
        Semaphore=CreateSemaphore(NULL, InitialCount, MaximumCount, NULL);
}
//---------------------------------------------------------------------------
void MySemaphore::uOpenSemaphore()
{
        Semaphore=OpenSemaphore(SEMAPHORE_MODIFY_STATE, false, NULL);
}
//---------------------------------------------------------------------------
bool MySemaphore::uReleaseSemaphore(long ReleaseCount, long PreviousCount)
{
        return ReleaseSemaphore(Semaphore, ReleaseCount, NULL);
}
//---------------------------------------------------------------------------
"Творю" в Borland C++ Builder 6.
ПЫСЫ: И кстати, как его на Билдере использовать (ну, какую функцию сначала вызывать, какую потом). Я делал на C#, но там уже есть стандартный класс Semaphore, так что с ним не было проблем. Но тут нужно обязательно на С++ и к тому же на Билдере. Заранее благодарен.
MaTBeu вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клиент-серверное взаимодействие посредством использования сокетов Cantana Компоненты Delphi 2 18.02.2008 19:27
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57
Клиет - серверное приложение Mitron Работа с сетью в Delphi 6 20.08.2007 19:57
Клиент-серверное приложение veryseldom Работа с сетью в Delphi 8 20.08.2007 19:57
Callback Wolfheart Win Api 12 02.06.2007 23:13