Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Клиент-сервер с использованием семафоров, Один сервер - один клиент 
:(
    Опции темы
AdrensAksidor
Дата 23.2.2014, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.1.2014

Репутация: нет
Всего: нет



  Нужно реализовать программу типа клиент-сервер, где клиент отправляет запрос на рисование, а сервер рисует прямоугольник с заданными параметрами. Семафор должен следить за тем, чтобы каждый сервер работал одновременно только с одним клиентом. Ах да, связь между ними должна быть реализована через общую память. 
   В общем-то рисование и связь сделал, а с семафорами не могу разобраться. Можете помочь дописать программу?
  
Сервер
Код

#include <Windows.h>
#include <iostream>
#include <fstream>
#include <tchar.h>
#define BUF_SIZE 256
TCHAR szName[]=TEXT("H:/read.txt");
using namespace std;
TCHAR szMsg[]=TEXT("Запрос удовлетворен");
HANDLE hSemaphore;
void Ris()
{ int x1, y1, x2, y2, r, g, b;
 cout << "Введите значения цвета по RGB" << endl << "R" << endl;
cin >> r;
cout << "G" << endl;
cin >> g;
cout << "B"<< endl;
cin >> b;
cout << "ВВедите коориднату x левого верхнего угла  прямоугольника" << endl;
cin >> x1;
cout << "ВВедите коориднату y левого верхнего угла  прямоугольника" << endl;
cin >> y1;
cout << "ВВедите коориднату x правого нижнего  угла прямоугольника" << endl;
cin >> x2;
cout << "ВВедите коориднату y правого нижнего угла прямоугольника" << endl;
cin >> y2;
HDC hdc = CreateDC ( TEXT("DISPLAY"), NULL, NULL, NULL ); 
RECT V;
V.left=x1;
V.top=y1;
V.right=x2;
V.bottom=y2;
FillRect(hdc, &V, CreateSolidBrush(RGB(r,g,b)));
DeleteDC ( hdc ); }
int _tmain()
{  setlocale(LC_ALL, "rus");
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = OpenFileMapping(
                   FILE_MAP_ALL_ACCESS,   // read/write access
                   FALSE,                 // do not inherit the name
                   szName);               // name of mapping object

   if (hMapFile == NULL)
   {
      cout << "Невозможно приступить к работе, так как нет заказа от клиента" << endl;
             GetLastError();
      return 1;
   }

   pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object
               FILE_MAP_ALL_ACCESS,  // read/write permission
               0,
               0,
               BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());

      CloseHandle(hMapFile);

      return 1;
   }
   MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
   CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
   Ris(); 
   UnmapViewOfFile(pBuf);
   CloseHandle(hMapFile);
   return 0;
}


Клиент, почти полностью взят с сайта Майкрософт:
Код

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <tchar.h>
using namespace std;
#define BUF_SIZE 256
TCHAR szName[]=TEXT("H:/read.txt");
TCHAR szMsg[]=TEXT("Рисование началось");

int _tmain()
{setlocale(LC_ALL, "rus");
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD)
                 szName);                 // name of mapping object

   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not create file mapping object (%d).\n"),
             GetLastError());
      return 1;
   }
   pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,
                        0,
                        BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).\n"),
             GetLastError());

       CloseHandle(hMapFile);

      return 1;
   }


   CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
   _getch();
   if (szMsg ==TEXT("Рисование началось")) { cout << "запрос не удовлетворен" << endl; }
   else {
       MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK); }
   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}



В клиенте не работает последний цикл If, т.е. даже если сервер не обработал запрос, вылезает сообщение "Рисование началось" вместо "запрос не удовлетворен". В случае же, если серев таки удовлетворил запрос, все нормально.  Как также сделать, чтобы клиент ждал ответа от сервера? С помощью события или как-то по другому?
PM MAIL   Вверх
GremlinProg
Дата 23.2.2014, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(AdrensAksidor @  23.2.2014,  16:37 Найти цитируемый пост)
if (szMsg ==TEXT("Рисование началось"))

Это условие выполнится не может уже по определению, так строки сравнивать нельзя!



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.3126 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.