Разработка программных дополнений по технологии "клиент - сервер". Метод коммуникации - отображение файла в память
Разработка приложений на платформе Win32 для исследования взаимодействия между процессами через отображение файла в память. Модель приложений "клиент - сервер". Описание алгоритма работы программы-клиента и программы-сервера. Результаты работы приложений.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 18.05.2014 |
Размер файла | 869,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Кафедра компьютерной инженирии
Курсовая работа
По системному программному обеспечению
на тему:
"Разработка программных дополнений по технологии "клиент - сервер". Метод коммуникации - отображение файла в память"
2014
Реферат
Пояснительная записка к курсовой работе содержит: ___ с., 9 рис., 3 табл., 2 приложения, 20 источников.
Цель работы: разработка приложений на платформе Win32 для исследования взаимодействия между процессами через отображение файла в память.
Объект разработки - программное обеспечение, в состав которого входят: программа, выполняющая функции сервера и две программы, выполняющие функции клиентов.
В курсовой работе применяются метод проектирования "сверху - вниз" и событийное программирование. Разработка программных приложений выполняется на платформе Win32 в среде Microsoft Visual Studio, с использованием для межпроцессного взаимодействия метода отображения файла в память.
Приложения архитектуры "клиент-сервер" применяются для организации обмена информацией между двумя объектами.
В результате разработки курсового проекта выполнено определение достоинств и недостатков архитектуры "клиент-сервер"; сделан обзор системных средств коммуникации и синхронизации процессов. Разработан менюориентированный пользовательский интерфейс. Выполнена отладка приложения.
WIN32 API, ОТОБРАЖЕНИЕ ФАЙЛА, ПАМЯТЬ, МЬЮТЕКС, БУФЕР, ПРОЦЕССЫ, СОБЫТИЯ, СИНХРОНИЗАЦИЯ ПРОЦЕССОВ, АЛГОРИТМ, ПРОГРАММА.
Содержание
- Введение
- 1. Теоретическая часть
- Модель приложений "клиент-сервер"
- Метод отображения файла в память
- 2. Практическая часть
- Постановка задачи
- Описание алгоритма работы программы-клиента
- Описание алгоритма работы программы-сервера
- Результаты работы приложений
- Выводы
- Перечень ссылок
- Приложения
Введение
Приобретение навыков в написании приложений клиент-сервер очень актуально. Использование приложений архитектуры "клиент-сервер" является неотъемлемой частью программирования. Приложения такого типа обеспечивают простой обмен информацией между сервером и клиентом (клиентами). Причем сервер и клиент могут располагаться как на одном компьютере, так и на разных источниках.
Технология "клиент-сервер" является полезной в условиях необходимости обработки различных данных, предоставляемых многими приложениями, с помощью одного устройства [1; 3]. Данная технология основывается на том, что существует приложение-сервер, которое принимает информацию и определенное количество приложений-клиентов, которые получают, обрабатывают информацию и предоставляют ее серверу для дальнейшей обработки или реализации. [2]
Приложения технологии клиент-сервер имеют ряд преимуществ, среди которых можно выделить основные:
Отсутствие дублирования кода программы-сервера программами-клиентами.
Так как все вычисления выполняются на сервере, то требования к приложениям-клиентам снижаются.
Все данные хранятся на сервере, который, как правило, защищён гораздо лучше большинства клиентов. На сервере проще обеспечить контроль полномочий, чтобы разрешать доступ к данным только клиентам с соответствующими правами доступа.
Также данная технология имеет свои недостатки. В качестве основного недостатка можно выделить то, что неработоспособность сервера может сделать неработоспособной всю вычислительную сеть. Неработоспособным сервером следует считать сервер, производительности которого не хватает на обслуживание всех клиентов, а также сервер, находящийся на ремонте, профилактике и т.п. [10]
В соответствии с поставленным заданием, необходимо разработать программу-сервер и программу-клиента. Целью программы-сервера является реализация соединения с программой-клиентом, передача и прием сообщений от программы-клиента, и вывод их в рабочее окно. Целью программы-клиента является выполнение функций, которые позволяют обеспечить соединение с программой-сервером, подготовить необходимую информацию и передать ее программе-серверу.
В итоге выполнения данной курсовой работы должно быть выполнено: разработка и отладка приложения-сервера и двух приложений-клиентов; составление схем алгоритмов к основным модулям программы; анализ работы разработанных приложений; написание пояснительной записки к курсовой работе.
Цель выполнения данной курсовой работы - разработка программного обеспечения, в состав которого входят: программа, выполняющая функции сервера и две программы, выполняющие функции клиентов. Задачей клиентов является подготовка информации в соответствии с заданием и передача ее серверу. Задачей сервера является вывод этой информации в окне приложения.
клиент сервер программа приложение
1. Теоретическая часть
Модель приложений "клиент-сервер"
Процессы, участвующие в межпроцессном взаимодействии, могут быть разделены на клиентов и серверов.
Клиент (client) - процесс, который запрашивает системную службу от какого-либо другого процесса.
Сервер (server) - процесс, который отвечает на клиентский запрос. [12; 14]
Модель клиент-сервер - это взаимодействия между одновременно выполняемыми программными процессами. Клиентские процессы посылают запросы серверному процессу, посылающему обратно результаты этих запросов. Взаимодействие между клиентским и серверным процессами представляет собой совместный транзакционный обмен, в котором активность исходит от клиента, а сервер реагирует на эту активность.
Под приложением клиент-сервер понимается любое приложение, в котором инициатор действия находится в одной системе, а исполнитель действия - в другой. Кроме того, в большинстве приложений клиент-сервер один сервер обслуживает запросы нескольких клиентов. [16] Взаимодействие клиента и сервера обеспечивается коммуникационным программным обеспечением. Примерами такого программного обеспечения являются набор протоколов TCP/IP, - протоколы OSI.
Таблица 1. 1.1 - Достоинства и недостатки архитектуры клиент-сервер
Системная характеристика |
Значение |
|
1 |
2 |
|
Достоинства |
||
Сеть небольших мощных машин |
Если одна машина выйдет из строя, компания все равно сможет продолжать работу |
|
Мощные объединения компьютеров |
Система предоставляет мощность, позволяющую выполнять работу без монополизации ресурсов. У конечных пользователей достаточно мощностей для локальной работы |
|
Некоторые рабочие станции столь же мощны, как мэйнфреймы, но их стоимость на порядок ниже |
Предоставляя вычислительные мощности за меньшие деньги, система позволяет тратить сэкономленные средства на другие приобретения или на увеличение доходов |
|
Открытые системы |
Аппаратуру, программы и услуги можно приобретать у разных поставщиков |
|
Легкость наращивания системы |
Систему нетрудно модернизировать, как только потребности изменятся |
|
Индивидуальная рабочая среда клиента |
Можно объединять компьютерные платформы, подбирая их под конкретные нужды подразделений и пользователей |
|
Недостатки |
||
Слабая поддержка |
Отдельные части системы не всегда корректно работают вместе. Бывает трудно найти причину неисправности |
|
Недостаток инструментальных средств обслуживания |
При использовании архитектуры клиент-сервер приходится искать инструментальные средства на рынке или разрабатывать их самостоятельно |
|
Необходимость переобучения |
Философия программирования для Маc или Windows отличается от философии программирования на языке COBOL |
Метод отображения файла в память
Механизмы использования межпроцессного взаимодействия (IPC), которые поддерживаются Windows:
буфер обмена;
модель компонентных объектов (com);
копирование данных (data copy);
динамический обмен данными (dde);
отображение (проекция) файла в память;
почтовые слоты (mailslots);
каналы (pipes);
вызов удаленной процедуры (rpc);
сокеты windows (windows sockets);
Использование отображения файла в памяти (разделяемая память).
Система виртуальной памяти в Win32 использует файл подкачки pagefile. sys и может преобразовывать страницы оперативной памяти в страницы файла на диске и наоборот. [4] Система может проецировать на оперативную память не только файл размещения, но и любой другой файл. Это может использоваться для совместного использования памяти несколькими процессами. Механизм отображения файлов может быть использован процессами, работающими только на локальном компьютере; он не используется для передачи данных по сети.
Функция CreateFileMapping создает именованный или неименованный объект-отображение файла:
HANDLE CreateFileMapping (
HANDLE hFile, // дескриптор файла для отображения
LPSECURITY_ATTRIBUTES lpAttributes, // атрибуты безопасности
DWORD flProtect, // флаги защиты
DWORD dwMaximumSizeHigh, // старшие DWORD максимального размера
DWORD dwMaximumSizeLow, // младшие DWORD максимального размера
LPCTSTR lpName // имя объекта-отображения файла
);
Рисунок 0.2. 1 - Схема использования разделяемой памяти
Отображение создается в приложении-сервере:
hMapFile = CreateFileMapping (
INVALID_HANDLE_VALUE, // использование файла подкачки
NULL, // защита по умолчанию
PAGE_READWRITE, // доступ к чтению/записи
0, // макс. размер объекта
1024, // размер буфера
"myFileMapping"); // имя отраженного в памяти объекта
lpD = (D*) MapViewOfFile (hMapFile, // дескриптор отраженного объекта
FILE_MAP_ALL_ACCESS, // разрешение чтения/записи
0, // старший DWORD смещения
0, // младший DWORD смещения
1024); // количество байт для сопоставления
Процесс-клиент вызывает функцию OpenFileMapping с именем "myFileMapping", чтобы использовать тот же объект-отображение файла, что и процесс-сервер. Функция MapViewOfFile используется для сопоставления области памяти процесса отображаемому файлу. [7]
hMapFile = OpenFileMapping (
FILE_MAP_ALL_ACCESS, // доступ к чтению/записи
FALSE, // имя не наследуется
"myFileMapping"); // имя "проецируемого " объекта
lpD= (D*) MapViewOfFile (hMapFile, // дескриптор отраженного в памяти объекта
FILE_MAP_ALL_ACCESS, // разрешение чтения/записи
0, // старший DWORD смещения
0, // младший DWORD смещения
1024); // количество байт для сопоставления
2. Практическая часть
Постановка задачи
Задачей данной курсовой работы является разработка приложения по технологии "клиент-сервер". Метод коммуникации между процессами, который необходимо использовать при выполнении работы - отображение файла в память. [17]
В состав программного обеспечения, разработанного в соответствии с заданием, должны входить:
программа, выполняющая функции сервера;
две программы, выполняющие функции клиентов.
Программа-сервер должна выполнять следующие функции:
а) создание отображения на страницу подкачки системы;
б) получение данных от приложений-клиентов;
в) вывод на экран полученных данных.
Программа-клиент 1 должна выполнять следующие функции:
а) открыть отображение файла;
б) подготовить и передать серверу такие данные: ширину полосы меню, наличие мыши в системе.
Программа-клиент 2 должна выполнять следующие функции:
а) открыть отображение файла
б) подготовить и передать серверу такие данные: ширина и высота иконки приложения, ширина и высота вертикальной полосы прокрутки.
Описание алгоритма работы программы-клиента
В результате выполнения курсовой работы было разработано приложение-сервер и два приложения-клиента.
В составе приложений-клиентов можно выделить следующие процедуры:
· Процедура отправки сообщения серверу,
· Процедуры подготовки клиентами информации в соответствии с заданием,
· Процедура подключения к серверу,
· Оконная процедура программы-клиента.
Описание переменных, которые используются в программе, дано в таблице 2.2.1:
Таблица 2.2.1 - Описание переменных программы-клиента
Исходный текст |
Описание |
|
char szBuf [512]; |
Буфер для обмена информацией |
|
DWORD cbWritten; |
Количество байтов, записанных в буфер |
|
static HWND hwndEdit; |
Дескриптор поля редактирования |
|
TCHAR mess [2048]; |
Буфер формирования сообщений на экран |
|
TCHAR* m_mess = mess; |
Ссылка на буфер |
|
TCHAR Buf [1024]; |
Буфер для данных |
|
struct D |
Структура для буфера |
|
HANDLE hServerMutex |
Дескриптор мьютекса на доступ к буферу памяти |
|
HANDLE hMapFile |
Дескриптор отображения файла |
|
HANDLE hEventVvod |
Дескриптор события "Данные готовы" |
|
TCHAR szWindowClass [MAX_LOADSTRING] |
Имя класса главного окна |
|
HINSTANCE hInst |
Текущий экземпляр |
|
LPCSTR nameMutex |
Имя мьютекса для отображения |
|
LPTSTR nameEvent |
Имя события для отображения |
|
bool Podkluchen |
Переменная для проверки статуса подключения клиента к серверу |
|
int menuW |
Переменная для размеров полосы меню |
|
bool fMouse |
Переменная для определения наличия мыши в системе |
|
int scr |
Переменная для размеров кнопки полосы прокрутки |
Процедура отправки сообщения серверу - содержит инструкции, которые позволяют организовать передачу приложением-клиентом подготовленной информации приложению-серверу. Схема алгоритма работы процедуры представлена на рисунке 2.2.1:
Рисунок 2.2.1 - Схема алгоритма процедуры отправки сообщения серверу
Проверка подключения клиента к серверу выполняется блоком 2 (рис. 2.2.1) и оператором 175 приложения Б. В случае отсутствия подключения пользователю выводится сообщение о необходимости установления подключения (блок 3, рис. 2.2.1 и операторы 183-185 приложения Б). В случае установленного подключения выполняется очистка буфера (блок 4, рис. 2.2.1), вызов рабочей функции function_kl (блок 5, рис. 2.2.1) и пересылка сообщения (блоки 6-8, рис. 2.2.1). Эти действия реализованы операторами 176-182 приложения Б.
Функции для подготовки клиентами информации в соответствии с заданием - содержат инструкции для подготовки необходимой информации и имеют похожую структуру. Схема алгоритма функции клиента №1 приведена на рисунке 2.2.2, клиента №2 - на рисунке 2.2.3.
Рисунок 2.2.2 - Схема алгоритма функции function_kl программы-клиента №1
В начале функций выполняется определение длины текста в поле редактирования окна приложения-клиента (блок 2, рис. 2.2.2 и рис. 2.2.3). С помощью функции SendMessage подготовленное сообщение пересылается в буфер szBuf (блок 3, рис. 2.2.2 и рис. 2.2.3). После символов в конец строки добавляется нулевой код - признак конца строки. С помощью функции sprintf содержимое буфера передается в символьный массив. Эти действия реализованы операторами 28-33 приложения Б для программы-клиента 1 и операторами 227-232 приложения Б для программы-клиента 2.
Далее в клиенте №1 вызывается функция GetSystemMetrics для получения ширины полосы меню (блок 4, рис.2.2.2 и оператор 34 приложения Б). Затем формируется сообщение с полученным значением (блок 5, рис. 2.2.2 и оператор 35 приложения Б). Следующим пунктом выполняется проверка на наличие мыши в системе (блоки 6-7, рис.2.2.2 и операторы 36-37 приложения Б) и формируется соответствующее сообщение (блок 8 или 9, рис. 2.2.2 и операторы 38-40 приложения Б).
Рисунок 2.2.3 - Схема алгоритма функции function_kl программы-клиента №2
В клиенте №2 вызывается функция GetSystemMetrics для получения ширины и высоты кнопки вертикальной полосы прокрутки (блок 4, рис. 2.2.3 и операторы 233-236 приложения Б). Затем формируется сообщение с полученными значениями (блок 5, рис. 2.2.3 и операторы 237-238 приложения Б). Следующим пунктом выполняется определение размеров иконки приложения (блок 6, рис. 2.2.3 и операторы 239-242 приложения Б) и формируется соответствующее сообщение (блок 7, рис. 2.2.3 и оператор 243 приложения Б).
Процедура подключения приложения-клиента к приложению-серверу - схема алгоритма представлена на рисунке 2.2.4 В начале блоком 2 (рис. 2.2.4) выполняется проверка установленного подключения (оператор 144 приложения Б). Если подключение не было установлено ранее, производится выполнение следующих функций:
· открытие проекции файла (блок 3, рис. 2.2.4 и операторы 145-148 приложения Б);
· представление проецированного файла (блок 6, рис. 2.2.4 и операторы 157-159 приложения Б);
· создание мьютекса (блок 9, рис. 2.2.4 и оператор 167 приложения Б);
· открытие события с автосбросом, со сброшенным начальным состоянием (блок 13, рис. 2.2.4 и оператор 171 приложения Б).
Оконная процедура программы-клиента - схема алгоритма представлена на рисунке 2.2.5 В начале выполняется анализ кода сообщения (блок 2, рис. 2.2.5 и оператор 127 приложения Б). В зависимости от кода выполняются инструкции, отображенные блоками 3, 7 или 10 (рис. 2.2.5).
При обработке сообщения WM_DESTROY (блок 3) о закрытии окна приложения-клиента особенностью является то, что предварительно необходимо освободить мьютекс, отменить отображение представления файла и закрыть отображение (блоки 3-6, рис. 2.2.5 и операторы 199-204 приложения Б).
При обработке сообщения WM_CREATE (блок 10) выполняется создание окна приложения-клиента с полем ввода, редактирования и отображения текста (операторы 128-134 приложения Б).
При получении сообщения WM_COMMAND (блок 7) о поступлении команды выполняется ее декодирование и организовывается переключатель для выбора процедуры обработки в зависимости от кода команды (блоки 8 или 9, рис. 2.2.5 и операторы 143-186 приложения Б). Процедура с кодом ID_32771 соответствует процедуре подключения клиента к серверу (рис. 2.2.4), а процедура с кодом ID_32772 - процедуре отправки сообщения серверу (рис. 2.2.1).
Рисунок 2.2.4 - Схема алгоритма процедуры подключения клиента к серверу
Рисунок 2.2.5 - Схема алгоритма оконной процедуры программы-клиента
Описание алгоритма работы программы-сервера
В реализации программы-сервера в качестве основной можно выделить оконную процедуру. Ее схема алгоритма представлена на рисунке 2.3.1 Описание переменных, которые используются в программе, приведено в таблице 2.3.1:
Таблица 2.3.1 - Описание переменных и констант программы-сервера
Исходный текст |
Описание |
|
1 |
2 |
|
TCHAR Buf [1024]; |
Буфер для данных |
|
static HWND hwndEdit; |
Дескриптор поля редактирования текста |
|
1 |
2 |
|
#define MAX_LOADSTRING 100 |
Строка заголовка |
|
#define BUF_SIZE 1024 |
Размерность буфера |
|
struct D |
Структура для буфера |
|
HANDLE hThreads [2] |
Дескриптор потока |
|
HANDLE hMapFile |
Дескриптор отображения файла |
|
HANDLE hEventVvod |
Дескриптор события "Данные готовы" |
|
TCHAR szWindowClass [MAX_LOADSTRING] |
Имя класса главного окна |
|
HINSTANCE hInst |
Текущий экземпляр |
Оконная процедура программы-сервера. В начале выполняется анализ кода сообщения (блок 2, рис. 2.3.1 и оператор 120 приложения А). В зависимости от кода выполняются инструкции, отображенные блоками 3 или 4 (рис. 2.3.1).
При обработке сообщения WM_DESTROY (блок 4) о закрытии окна приложения-сервера особенностью является то, что предварительно необходимо завершить выполнение потока, отменить отображение представления файла и закрыть отображение (блоки 4-7, рис. 2.3.1 и операторы 175-180 приложения А).
При обработке сообщения WM_CREATE в начале блоком 3 выполняется создание отображение объекта (операторы 122-128 приложения А). Далее выполняется представление проецированного файла (блок 11, рис. 2.3.1 и операторы 135-137 приложения А). Затем блоком 14 (рис. 2.3.1) выполняется создание мьютекса (реализовано операторами 144-145 приложения А). С помощью блока 18 (рис. 2.3.1) выполняется создание окна приложения-сервера с полем ввода, редактирования и отображения текста (операторы 148-151 приложения А). Задаются необходимые параметры размеров и расположения на экране окна приложения-сервера. Далее блоком 19 (рис. 2.3.1) выполняется создание потока для получения сообщения от приложения-клиента (оператор 153 приложения А).
Рисунок 2.3.1 - Схема алгоритма оконной процедуры программы-сервера
Для отладки программ необходимо размещать и серверную, и клиентскую программы на одном локальном компьютере. Это объясняется тем, что используемый метод отображения файла в память применяется на одном локальном компьютере.
Результаты работы приложений
Разработка и отладка программы выполнялась в среде Microsoft Visual Studio. В итоге было разработано одно приложение-сервер и два приложения клиента, которые были проверены на практике и выполняют необходимые требования. В результате выполнения программы от клиентов 1 и 2 по выбору пользователя передаются данные серверу. Первый клиент передает данные о ширине полосы меню и о наличии мыши в системе. Второй клинт передеает данные о размерах кнопки полосы прокрутки и иконки приложения. Сервер получает данные в виде: "Клиент #1. Сообщение" и "Клиент #2. Сообщение". Также реализована возможность ввода информации в поле клиентов и отправка ее серверу вместе с данными. Изображения окон работающих приложений приведены на рисунках 2.4.1 и 2.4.2:
Рис. 2.4.1 - Окна приложений сервера и клиента №1
Рис. 2.4.2 - Окна приложений сервера и клиента №2
Выводы
Целью данной курсовой работы была разработка приложений архитектуры "клиент-сервер". Разработанные приложения включают: приложение, выполняющее функции сервера и два приложения, которые выполняют функции клиентов.
Архитектура "клиент-сервер" позволяет реализовать обмен информации между двумя устройствами: сервером и клиентом. Согласно данной технологии, клиент запрашивает у сервера некоторые услуги, предоставляя определенные исходные данные и параметры с помощью одного из методов коммуникации между потоками, а сервер обслуживает запрос. Метод коммуникации между процессами, использованный в данной работе, - отображение файла в память.
В результате выполнения данной курсовой работы было разработано три приложения: два приложения-клиента, которые получают необходимую информацию о характеристиках системы и приложение-сервер, которому полученная информация передается для последующего ее вывода на экран. Были выполнены требования, представленные к разрабатываемым приложениям.
По окончанию выполнения работы, разработанные приложения были проверены на практике и полностью подтвердили свою работоспособность. Были проведены необходимые исследования и составлены схемы алгоритмов к основным модулям приложений.
Можно сделать вывод, что поставленная задача была достигнута, задание на курсовой проект было выполнено.
Перечень ссылок
1. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение: Учебник для вузов - СПб: Питер, 2003. - 736 с. - С.389.
2. Дейтел Х.М., Дейтел П. Дж., Чофнес Д.Р. Операционные системы. Основы и принципы: Третье издание. Пер. с англ. - М.: ООО "Бином-Пресс", 2006. - 1024 с. - С.768.
3. Демройк М.Ю. Начала программирования. Распределенные системы, безопасность схем программирования. - М.: ООО "Бином-Пресс", 2009. - 704 с. - С.143.
4. Джонсон М. Системное программирование в среде Win32, 2-е изд.: Пер. с англ. - M.: Издательский дом "Вильямс”, 2001. - 464 с. - С.346.
5. Документация Win32 API (MSDN).
6. Питер Блюм, LabVIEW. Стиль программирования, М: "ДМК Пресс", 2008.
7. Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows, 4-е изд.: Пер, англ - СПб: Питер; М.: Издательско-торговый дом "Русская Редакция", 2001. - 752 с. - С.578.
8. Страуструп Б. Язык программирования С++. Специальное издание. Пер. с англ. - М.: ООО "И.Д. Вильямс", 2007. - 1104 с.
9. Суранов А.Я., LabVIEW 8.20., Справочник по функциям, М: "ДМК Пресс", 2007.
10. Таненбаум Э. Современные операционные системы, 2-е изд.: Пер. с англ. - СПб: Питер, 2003. - 1040 с. - С.552.
11. Таненбаум Э. Современные операционные системы, 2-е изд.: Пер. с англ. - СПб: Питер, 2003. - 1040 с.
12. Трахтенгерц Э.А. Программное обеспечение параллельных процессов. - М.: Наука, 2003. - 272 с. - С.84.
13. Трэвис Дж., Кринг Дж., LabVIEW для всех, М: "ДМК Пресс", 2008.
14. Щербаков Є.В., Щербакова М. Є. Мовні засоби системного програмування: навчальний посібник. - Луганськ: Вид-во СНУ ім.В. Даля, 2006. - 376 с.
15. Щербаков Є.В., Щербакова М. Є., Скарга-Бандурова І.С. Діалогові засоби системного програмування: навчальний посібник. - Луганськ: Вид-во СНУ ім.В. Даля, 2010. - 408 с.
16. Эндрюс Грегори Р. Основы многопоточного, параллельного и распределенного программирования. / Пер. с англ. К.: Диалектика, 2008. - 512 с. - С.153.
17. Методические указания к курсовой работе по дисциплине "Системное программное обеспечение - 42 с.
18. http://loi. sscc.ru/gis/oop/win32api/win32.html
19. http://msdn. microsoft.com/ru-ru/library/bb384843. aspx
20. http://w32api. narod.ru/functions/GetSystemMetrics.html
Приложения
Приложение А
Распечатка программы-сервера
// MapServer. cpp: определяет точку входа для приложения.
#include "stdafx. h"
#include "MapServer. h"
#include <stdio. h>
#include <process. h>
#include <wchar. h>
#include <sstream>
#define MAX_LOADSTRING 100
#define BUF_SIZE 1024
LPCSTR nameMutex = "Global\\MapMutex";
LPTSTR nameEvent = "Global\\MapEvent";
HANDLE hServerMutex; // дескриптор мьютекса на доступ к буферу памяти
HANDLE hEventVvod;
unsigned uThreadIDs [2];
HANDLE hThreads [2];
BOOL Working=true;
HANDLE hMapFile;
static HWND hwndEdit;
struct D{
TCHAR Buf [1024];
};
D* lpD;
// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
TCHAR szTitle [MAX_LOADSTRING]; // Текст строки заголовка
TCHAR szWindowClass [MAX_LOADSTRING]; // имя класса главного окна
// Отправить объявления функций, включенных в этот модуль кода:
ATOMMyRegisterClass (HINSTANCE hInstance);
BOOLInitInstance (HINSTANCE, int);
LRESULT CALLBACKWndProc (HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACKAbout (HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{UNREFERENCED_PARAMETER (hPrevInstance);
UNREFERENCED_PARAMETER (lpCmdLine);
// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;
// Инициализация глобальных строк
LoadString (hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString (hInstance, IDC_MAPSERVER, szWindowClass, MAX_LOADSTRING);
MyRegisterClass (hInstance);
// Выполнить инициализацию приложения:
if (! InitInstance (hInstance, nCmdShow))
{return FALSE;
}
hAccelTable = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDC_MAPSERVER));
// Цикл основного сообщения:
while (GetMessage (&msg, NULL, 0, 0))
{if (! TranslateAccelerator (msg. hwnd, hAccelTable, &msg))
{TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return (int) msg. wParam;
}
// ФУНКЦИЯ: MyRegisterClass ()
// НАЗНАЧЕНИЕ: регистрирует класс окна.
// КОММЕНТАРИИ:
// Эта функция необходима в случае, если нужно, чтобы данный код
// был совместим с системами Win32, не имеющими функции RegisterClassEx'
// которая была добавлена в Windows 95. Вызов этой функции важен для того,
// чтобы приложение получило "качественные" значки и установило связь с ними.
ATOM MyRegisterClass (HINSTANCE hInstance)
{WNDCLASSEX wcex;
wcex. cbSize = sizeof (WNDCLASSEX);
wcex. style= CS_HREDRAW | CS_VREDRAW;
wcex. lpfnWndProc= WndProc;
wcex. cbClsExtra= 0;
wcex. cbWndExtra= 0;
wcex. hInstance= hInstance;
wcex. hIcon= LoadIcon (hInstance, MAKEINTRESOURCE (IDI_MAPSERVER));
wcex. hCursor= LoadCursor (NULL, IDC_ARROW);
wcex. hbrBackground= (HBRUSH) (COLOR_WINDOW+1);
wcex. lpszMenuName= MAKEINTRESOURCE (IDC_MAPSERVER);
wcex. lpszClassName= szWindowClass;
wcex. hIconSm= LoadIcon (wcex. hInstance, MAKEINTRESOURCE (IDI_SMALL));
return RegisterClassEx (&wcex);
}
// ФУНКЦИЯ: InitInstance (HINSTANCE, int)
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
// КОММЕНТАРИИ:
// В данной функции дескриптор экземпляра сохраняется в глобальной переменной,
а также создается и выводится на экран главное окно программы.
BOOL InitInstance (HINSTANCE hInstance, int nCmdShow)
{ HWND hWnd;
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
hWnd = CreateWindow (szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (! hWnd)
{ return FALSE;
}
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
return TRUE;
}
unsigned __stdcall VvodThreadFunc (void * arg) // Поток ожидания данных от клиентов
{while (Working)
{WaitForSingleObject (hEventVvod, INFINITE); // Ждем своего события
WaitForSingleObject (hServerMutex, INFINITE); // Ждем доступа к памяти
// данные готовы, вывод на экран
SendMessage (hwndEdit, WM_SETTEXT, 0, (LPARAM) lpD->Buf);
ReleaseMutex (hServerMutex); // Разрешаем записывать в общую память
}
_endthreadex (0);
return 0;
};
// ФУНКЦИЯ: WndProc (HWND, UINT, WPARAM, LPARAM)
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
// WM_COMMAND - обработка меню приложения
// WM_PAINT-Закрасить главное окно
// WM_DESTROY - ввести сообщение о выходе и вернуться.
LRESULT CALLBACK WndProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR ss [80];
switch (message)
{case WM_CREATE:
hMapFile = CreateFileMapping (
INVALID_HANDLE_VALUE, // использование файла подкачки
NULL, // защита по умолчанию
PAGE_READWRITE, // доступ к чтению/записи
0, // макс. размер объекта
BUF_SIZE, // размер буфера
"myFileMapping"); // имя отраженного в памяти объекта
if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{ MessageBox (hWnd,
"Не может создать отраженный в памяти объект (%d). \n",
"Map", MB_OK);
return 0;
}
lpD= (D*) MapViewOfFile (hMapFile, // дескриптор отраж. в памяти объекта
FILE_MAP_ALL_ACCESS, // разрешение чтения/записи
0, 0, BUF_SIZE);
if (lpD == NULL)
{ MessageBox (hWnd,
"Представление проецированного файла не возможно (%d). \n",
"Map",MB_OK);
return 0;
}
hServerMutex = CreateMutexA (NULL, true, nameMutex);
if (hServerMutex == NULL) MessageBox (hWnd, "Error mutex", "Map",MB_OK);
// Создаем событиe с автосбросом, со сброшенным начальным состоянием
hEventVvod = CreateEvent (NULL, FALSE, TRUE, nameEvent);
hwndEdit = CreateWindow (TEXT ("EDIT"), NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
10, 40, 500, 400, hWnd, NULL, hInst, NULL);
// Создаем поток
hThreads [0] = (HANDLE) _beginthreadex (NULL,0,&VvodThreadFunc,0,0,&uThreadIDs [0]);
ReleaseMutex (hServerMutex);
break;
case WM_COMMAND:
wmId = LOWORD (wParam);
wmEvent = HIWORD (wParam);
switch (wmId)
{case IDM_ABOUT:
DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow (hWnd);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
// TODO: Add any drawing code here.
EndPaint (hWnd, &ps);
break;
case WM_DESTROY:
CloseHandle (hThreads [0]);
UnmapViewOfFile (lpD);
CloseHandle (hMapFile);
PostQuitMessage (0);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER (lParam);
switch (message)
{case WM_INITDIALOG:
return (INT_PTR) TRUE;
case WM_COMMAND:
if (LOWORD (wParam) == IDOK || LOWORD (wParam) == IDCANCEL)
{EndDialog (hDlg, LOWORD (wParam));
return (INT_PTR) TRUE;
}
break;
}
return (INT_PTR) FALSE;
}
Приложение Б
Распечатка программы-клиента №1
// client_1. cpp: определяет точку входа для приложения.
#include "stdafx. h"
#include "client_1. h"
#include <stdio. h>
#define MAX_LOADSTRING 100
#define BUF_SIZE 1024
// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
TCHAR szTitle [MAX_LOADSTRING]; // Текст строки заголовка
TCHAR szWindowClass [MAX_LOADSTRING]; // имя класса главного окна
LPCSTR nameMutex = "Global\\MapMutex";
LPTSTR nameEvent = "Global\\MapEvent";
HANDLE hServerMutex; // дескриптор мьютекса на доступ к буферу памяти
HANDLE hEventVvod; // дескриптор события "Данные готовы"
HANDLE hMapFile;
char szBuf [512];
struct D{
char Buf [1024];
};
D* lpD;
bool Podkluchen=false;
TCHAR mess [2048];
TCHAR* m_mess = mess;
static HWND hwndEdit;
int menuW;
bool fMouse;
void function_kl (HWND hWnd)
{ // Определение длины текста в поле редактирования
DWORD cbWritten = SendMessage (hwndEdit,WM_GETTEXTLENGTH,0,0);
SendMessage (hwndEdit, WM_GETTEXT, (WPARAM) cbWritten, (LPARAM) szBuf);
// Отсылаем введенную строку на сервер
sprintf (m_mess, szBuf, strlen (szBuf) + 1,&cbWritten,m_mess);
sprintf (m_mess, "%s\n\r\n",m_mess);
menuW=GetSystemMetrics (SM_CYMENU); // ширина полосы меню в пикселях
sprintf (m_mess, "%s\nШирина полосы меню: %d px\r\n",m_mess,menuW);
fMouse = GetSystemMetrics (SM_MOUSEPRESENT); // наличие мыши в системе
if (fMouse)
sprintf (m_mess, "%sМышь присутствует в системе. \r\n",m_mess);
else
sprintf (m_mess, "%sМышь отсутствует в системе. \r\n",m_mess);
return;
}
// Отправить объявления функций, включенных в этот модуль кода:
ATOMMyRegisterClass (HINSTANCE hInstance);
BOOLInitInstance (HINSTANCE, int);
LRESULT CALLBACKWndProc (HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACKAbout (HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{UNREFERENCED_PARAMETER (hPrevInstance);
UNREFERENCED_PARAMETER (lpCmdLine);
// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;
// Инициализация глобальных строк
LoadString (hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString (hInstance, IDC_CLIENT_1, szWindowClass, MAX_LOADSTRING);
MyRegisterClass (hInstance);
// Выполнить инициализацию приложения:
if (! InitInstance (hInstance, nCmdShow))
{return FALSE;
}
hAccelTable = LoadAccelerators (hInstance, MAKEINTRESOURCE (IDC_CLIENT_1));
// Цикл основного сообщения:
while (GetMessage (&msg, NULL, 0, 0))
{if (! TranslateAccelerator (msg. hwnd, hAccelTable, &msg))
{TranslateMessage (&msg);
DispatchMessage (&msg);
}
}
return (int) msg. wParam;
}
// ФУНКЦИЯ: MyRegisterClass ()
// НАЗНАЧЕНИЕ: регистрирует класс окна.
// КОММЕНТАРИИ:
// Эта функция необходима только в случае, если нужно, чтобы данный
// код был совместим с системами Win32, не имеющими функции RegisterClassEx'
// которая была добавлена в Windows 95. Вызов этой функции важен для того,
// чтобы приложение получило "качественные" значки и установило связь с ними.
ATOM MyRegisterClass (HINSTANCE hInstance)
{WNDCLASSEX wcex;
wcex. cbSize = sizeof (WNDCLASSEX);
wcex. style= CS_HREDRAW | CS_VREDRAW;
wcex. lpfnWndProc= WndProc;
wcex. cbClsExtra= 0;
wcex. cbWndExtra= 0;
wcex. hInstance= hInstance;
wcex. hIcon= LoadIcon (hInstance, MAKEINTRESOURCE (IDI_CLIENT_1));
wcex. hCursor= LoadCursor (NULL, IDC_ARROW);
wcex. hbrBackground= (HBRUSH) (COLOR_WINDOW+1);
wcex. lpszMenuName= MAKEINTRESOURCE (IDC_CLIENT_1);
wcex. lpszClassName= szWindowClass;
wcex. hIconSm= LoadIcon (wcex. hInstance, MAKEINTRESOURCE (IDI_SMALL));
return RegisterClassEx (&wcex);
}
// ФУНКЦИЯ: InitInstance (HINSTANCE, int)
// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.
// КОММЕНТАРИИ:
// В данной функции дескриптор экземпляра сохраняется в глобальной переменной,
// а также создается и выводится на экран главное окно программы.
BOOL InitInstance (HINSTANCE hInstance, int nCmdShow)
{ HWND hWnd;
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной
hWnd = CreateWindow (szWindowClass, // szTitle,
"Клиент №1",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 400, 250, NULL, NULL, hInstance, NULL);
if (! hWnd)
{ return FALSE;
}
ShowWindow (hWnd, nCmdShow);
UpdateWindow (hWnd);
return TRUE;
}
// ФУНКЦИЯ: WndProc (HWND, UINT, WPARAM, LPARAM)
// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.
// WM_COMMAND - обработка меню приложения
// WM_PAINT-Закрасить главное окно
// WM_DESTROY - ввести сообщение о выходе и вернуться.
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
int j;
switch (message)
{case WM_CREATE:
hwndEdit = CreateWindow ( // Создаем доч. окно для вывода данных от процессов
TEXT ("EDIT"), TEXT ("Клиент #1. Сообщение: \r\n"),
WS_CHILD | WS_VISIBLE | WS_VSCROLL |
ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL,
20, 10, 400, 200, hWnd, NULL, hInst, NULL);
break;
case WM_COMMAND:
wmId = LOWORD (wParam);
wmEvent = HIWORD (wParam);
// Parse the menu selections:
switch (wmId)
{case IDM_ABOUT:
DialogBox (hInst, MAKEINTRESOURCE (IDD_ABOUTBOX), hWnd, About);
break;
case ID_32771: // пункт меню "Подключиться"
if (Podkluchen) return 0;
hMapFile = OpenFileMapping (
FILE_MAP_ALL_ACCESS, // доступ к чтению/записи
FALSE, // имя не наследуется
"myFileMapping"); // имя "проецируемого " объекта
if (hMapFile == NULL)
{
MessageBox (hWnd,
"Невозможно открыть объект проекция файла",
"Клиент",MB_OK);
Podkluchen=false;
return 0;
}
lpD= (D*) MapViewOfFile (hMapFile, // дескриптор "проец." объекта
FILE_MAP_ALL_ACCESS, // разрешение чтения/записи
0, 0, BUF_SIZE);
if (lpD == NULL)
{ MessageBox (hWnd,
"Представление проецированного файла невозможно (%d). \n",
"Клиент",MB_OK);
Podkluchen=false;
return 0;
}
hServerMutex = CreateMutexA (NULL, true, nameMutex);
if (hServerMutex == NULL) MessageBox (hWnd, "Error mutex",
"Map",MB_OK);
// Откр. событиe с автосбросом, со сброшенным начальным состоянием
hEventVvod = OpenEvent (EVENT_ALL_ACCESS, FALSE, nameEvent);
Podkluchen=true;
break;
case ID_32772: // пункт меню "послать сообщение"
if (Podkluchen)
{FillMemory (lpD->Buf,1024,0); // очистка буфера
Function_kl (hWnd);
for (int j=0; j<sizeof (mess); j++)
lpD->Buf [j] =m_mess [j];
SetEvent (hEventVvod);
ReleaseMutex (hServerMutex);
}
else
MessageBox (hWnd,
"Надо подключиться к серверу\n", "Клиент1", MB_OK);
break;
case IDM_EXIT:
DestroyWindow (hWnd);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint (hWnd, &ps);
// TODO: Add any drawing code here.
EndPaint (hWnd, &ps);
break;
case WM_DESTROY:
UnmapViewOfFile (lpD);
CloseHandle (hMapFile);
ReleaseMutex (hServerMutex);
PostQuitMessage (0);
break;
default:
return DefWindowProc (hWnd, message, wParam, lParam);
}
return 0;
}
// Обработчик сообщений для окна "О программе".
INT_PTR CALLBACK About (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER (lParam);
switch (message)
{case WM_INITDIALOG:
return (INT_PTR) TRUE;
case WM_COMMAND:
if (LOWORD (wParam) == IDOK || LOWORD (wParam) == IDCANCEL)
{EndDialog (hDlg, LOWORD (wParam));
return (INT_PTR) TRUE;
}
break;
}
return (INT_PTR) FALSE;
}
Распечатка функции function_kl программы-клиента №2
void function_kl (HWND hWnd)
{
// Определение длины текста в поле редактирования
DWORD cbWritten = SendMessage (hwndEdit,WM_GETTEXTLENGTH,0,0);
SendMessage (hwndEdit, WM_GETTEXT, (WPARAM) cbWritten, (LPARAM) szBuf);
// Отсылаем введенную строку на сервер
sprintf (m_mess, szBuf, strlen (szBuf) + 1,&cbWritten,m_mess);
sprintf (m_mess, "%s\n\r\n",m_mess);
scr=GetSystemMetrics (SM_CXVSCROLL);
int a=scr;
scr=GetSystemMetrics (SM_CYVSCROLL);
int b=scr;
sprintf (m_mess, "%sШирина и высота кнопки полосы прокрутки: %d x %d
px\r\n",m_mess,a, b);
menuW=GetSystemMetrics (SM_CXICON);
a=menuW;
menuW=GetSystemMetrics (SM_CYICON);
b=menuW;
sprintf (m_mess, "%sШирина и высота иконки приложения: %d x %d px\r\n",m_mess,a, b);
return;
}
Размещено на Allbest.ru
Подобные документы
Характеристика модели клиент-сервер как технологии взаимодействия в информационной сети. Разработка и описание алгоритмов работы приложений на платформе Win32 в среде Microsoft Visual Studio, использующих для межпроцессного взаимодействия сокеты.
курсовая работа [544,6 K], добавлен 02.06.2014Анализ архитектуры информационной системы, в структуру которой входят системы файл-сервер и клиент-сервер. Сравнение языков запросов SQL и QBE. Принципы разработки приложений архитектуры клиент-сервер при помощи структурированного языка запросов SQL.
курсовая работа [88,9 K], добавлен 11.04.2010Устройство веб-приложений, преимущества их построения. Характеристика технологий веб-программирования, используемых на стороне сервера и на стороне клиента. Формирование и обработка запросов, создание интерактивного и независимого от браузера интерфейса.
контрольная работа [76,4 K], добавлен 08.07.2014Основные вехи на пути развития систем программирования. Microsoft Access - первая СУБД для персональных компьютеров, созданная для работы в среде Windows. Перенос файл-серверных приложений в среду клиент-сервер. Использование ActiveX Data Objects.
презентация [662,2 K], добавлен 11.04.2013Характеристика разновидностей программной реализации чатов. Разработка программы клиент-серверного чата с возможность общения в локальной сети нескольких человек одновременно. Протокол взаимодействия клиента и сервера. Порядок работы с программой.
курсовая работа [530,7 K], добавлен 25.04.2015Описание предметной области и разработка электронного учебника на основе архитектуры "клиент – сервер". Тестирование программы менеджера и создание интерфейса главного меню. Вход в программу в качестве пользователя и обеспечение перехода к данным лекций.
курсовая работа [1,5 M], добавлен 26.02.2015Рассмотрение архитектуры "файл-сервер" и двух- и трехуровневых архитектур "клиент-сервер". Модель сервера приложений и свойства "идеальной" системы управления распределенными базами данных. Способы распределения функций обработки логики запроса.
презентация [60,2 K], добавлен 19.08.2013Файловая и сетевая системы операционной системы Windows. Характеристика модели "клиент-сервер". Функциональные требования и архитектура программы, которая должна обеспечивать передачу файлов от клиента к серверу, сервера к клиенту, обмен сообщениями.
курсовая работа [1,4 M], добавлен 24.04.2013Разработка API взаимодействия клиентских приложений с сервером СУБД через Pipe под Windows. Устройство и характеристики СУБД SQLite. Методы WinAPI для передачи данных. Реализация взаимодействия через PIPE. Результат работы серверного приложения.
курсовая работа [596,3 K], добавлен 09.05.2014Характеристики распределенных систем баз данных, формируемые путем "интеграции" разнородных аппаратных и программных средств. Концепция дифференциального файла для различных приложений. Сравнение разных технологий файлового сервера и "клиент-сервера".
курсовая работа [411,9 K], добавлен 28.05.2015