Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа#7,8.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
57.57 Кб
Скачать

Лабораторная работа № 7. Организация взаимодействия между процессами посредством почтовых ящиков и конвейеров

Цель: Изучение механизмов взаимодействия между процессами обмена сообщениями в операционной системе Windows.

Задачи:

1. Изучение теоретического материала по взаимодействию между процессами посредством почтовых ящиков и конвейеров.

2. Составление алгоритма программы.

3. Программная реализация.

Ход работы:

1. Получить у преподавателя индивидуальный вариант задания, который должен предусматривать разработку двух программ (сервер и клиент) и взаимодействие между ними посредством почтовых ящиков или конвейеров.

2. Разработать и отладить сервер и клиент в соответствии с полученным заданием.

3. Написать отчет и представить его к защите вместе с исполняемыми модулями программ и их исходными текстами.

Ход защиты:

1. Продемонстрировать преподавателю программы, использующие механизмы взаимодействия между процессами посредством почтовых ящиков и конвейеров.

2. Пояснить программный код разработанных приложений.

Почти во всех ОС семейства Windows реализован механизм называемый почтовыми ящиками (ПЯ). Они позволяют одному клиентскому процессу передавать сообщения одному или нескольким серверным на одном и том же компьютере или на разных. Разработка приложений, использующих ПЯ, не требует знания сетевых протоколов. Поскольку ПЯ основаны на широковещании, то они не гарантируют доставки данных.

ПЯ основаны на интерфейсе файловой системы. Клиенты и серверы используют стандартные функции Win32 API для отправки и получения данных почтовым ящиком, а также правила именования файловой системы, а именно:

\\сервер\Mailslot\[path]name

где сервер – имя сервера, на котором создается ПЯ и выполняется серверное приложение, Mailslot – фиксированная обязательная строка, [path]name – имя почтового ящика. В качестве сервера может быть задана точка (.), снежинка (*), имя домена или сервера.

Для передачи сообщений по сети ПЯ обычно используют дейтаграммы – небольшие порции данных, передаваемые по сети без установления соединения. Для совместимости с большинством версий Windows нежелательно использовать ПЯ, чьи размеры превышают 424 байта, поскольку в некоторых из ОС сообщения больших размеров не пересылаются.

ПЯ используют архитектуру клиент-сервер, где данные передаются только в одном направлении. Сервер создает ПЯ и является единственным процессом, который может читать из него данные. Клиенты ПЯ – это процессы, открывающие экземпляры ПЯ и единственные, имеющие право записывать в них данные. Таким образом, для реализации ПЯ нужно написать базовое серверное приложение, в котором выполнить следующие действия:

  1. Создать описатель ПЯ с помощью CreateMailSlot.

  2. Получить данные от любого клиента путем вызова ReadFile с описателем ПЯ в качестве параметра.

  3. Закрыть описатель ПЯ с помощью CloseHandle.

Первая из упомянутых функций определена так:

HANDLE CreateMailSlot(

LPCTSTR Name, // имя ПЯ

DWORD MaxMessSize,

// максимальный размер сообщения (0 – любой размер)

DWORD TimeOut, // Время ожидания сообщений, в мс.

LPSECURITY_ATTRIBUTES Attrib); //атрибуты безопасности

После создания ПЯ можно читать данные. Единственный процесс, который может читать, это сервер. Для этого надо вызвать функцию

HANDLE ReadFile(

HANDLE File, // описатель файла

LPVOID Buffer, // буфер для сообщения

DWORD BytesToRead,

// размер буфера (обязательно больше размера сообщения)

LPDWORD BytesRead, // количество прочитанных байтов

LPOVERLAPPED Overlap); // асинхронное чтение данных из буфера

Сервер почтовых ящиков должен выглядеть следующим образом.

#include <windows.h>

#include <stdio.h>

void main(void)

{

HANDLE Mailslot;

char buffer[256];

DWORD NumberOfBytesRead;

// Создание почтового ящика и бесконечное ожидание сообщений

if ((Mailslot = CreateMailslot("\\\\.\\Mailslot\\slot1", 0,

MAILSLOT_WAIT_FOREVER, NULL)) == INVALID_HANDLE_VALUE)

{

printf("Ошибка при создании ПЯ %d\n", GetLastError());

return;

}

// Бесконечное чтение данных из ПЯ!

while(ReadFile(Mailslot, buffer, 256, &NumberOfBytesRead,

NULL) != 0)

{

buffer[NumberOfBytesRead] = 0;

printf("%s\n", buffer);

}

CloseHandle (Mailslot);

}

Для реализации клиента нужно разработать приложение, ссылающееся на существующий ящик и записывающее в него данные. В таком приложении необходимо выполнить следующие шаги: