Вариант №23

Разработать программу, которая выводит список файлов из указанного пользователем каталога. В данном списке не должны показываться элементы, чье время модификации раньше, чем указанное пользователем значение.

Вариант №24

Разработать программу, которая выводит список файлов из указанного пользователем каталога. В данном списке не должны показываться элементы, чье время доступа раньше, чем указанное пользователем значение.

Вариант №25

Разработать программу, которая эмулирует работу с файлами с записями фиксированной длины (Как известно, в ОС семейства Windows практически не поддерживаются структурированные файлы).

В таких структурированных файлах данные представляются в виде записей, длина которых фиксирована в пределах файла:

Запись 1

Запись 2

Запись N

Длина записи L

Длина записи L

...

Длина записи L

Доступ к n-й записи осуществляется либо путем последовательного чтения n – 1 предшествующих записей, либо прямо по адресу, вычисленному по ее порядковому номеру. Например, начальный адрес n-й записи равен
L × n, если L – длина записи. Над файлами необходимо обеспечить операции создания, удаления, открытия, закрытия, чтения и записи.

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

Цель: Изучение механизмов взаимодействия между процессами обмена сообщениями в операционной системе 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);

}

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

1.  Открыть описатель ПЯ, в который нужно записать данные с помощью CreateFile.

2.  Записать данные в ПЯ вызовом функции WriteFile.

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

Открытие файла осуществляется при помощи функции

HANDLE CreateFile (

LPCTSTR Name, // имя ПЯ

DWORD DesAccess, // желаемый доступ

DWORD Sharing, // режим разделения

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

DWORD CreatDispos, // создать или открыть

DWORD Flags, // флаги и атрибуты

HANDLE Template); // шаблон

Поскольку клиент может только записывать данные на сервер, то параметр DesAccess может быть только GENERIC_WRITE. Параметр Sharing должен быть только FILE_SHARE_READ, чтобы сервер мог открывать и читать из почтового ящика. Флаг CreateDispos обязан быть OPEN_EXISTING, а FlagsFILE_ATTRIBUTE_NORMAL.

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

HANDLE WriteFile(

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

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

DWORD BytesToWrite,

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

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

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

Пример клиента почтового ящика приведен ниже.

#include <windows. h>

#include <stdio. h>

void main(int argc, char *argv[])

{

HANDLE Mailslot;

DWORD BytesWritten;

CHAR ServerName[256];

// Вид командной строки для сервера,

// которому отправляется сообщение

if (argc < 2)

{

printf("Использование: client <server_name>\n");

return;

}

sprintf(ServerName, "\\\\%s\\Mailslot\\Slot1", argv[1]);

if ((Mailslot = CreateFile(ServerName, GENERIC_WRITE,

FILE_SHARE_READ, NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, NULL)) ==

INVALID_HANDLE_VALUE)

{

printf("Создание файла с ошибкой %d\n",

GetLastError());

return;

}

if (WriteFile(Mailslot, "Это тестовое сообщение",

sizeof ("Это тестовое сообщение"),

&BytesWritten, NULL) == 0)

{

printf("Запись в файл с ошибкой %d\n", GetLastError());

return;

}

printf("Записано %d байтов\n", BytesWritten);

CloseHandle(Mailslot);

}

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

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

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

где сервер – имя сервера, на котором создается ИК, Pipe – фиксированная обязательная строка, [path]name – имя ИК. В качестве сервера может быть задана точка (.) и имя сервера. ИК нельзя создать на удаленном компьютере.

ИК используют два режима передачи данных: побайтовый и
сообщений. В первом случае сообщения передаются непрерывным потоком байтов между клиентом и сервером, при этом они не знают, сколько байтов считывается или записывается в ИК в определенный момент времени.
Значит, запись N байтов с одной стороны канала не означает чтения такого же количества байтов с другой стороны. Такой способ позволяет не заботиться о содержимом передаваемых данных. Во втором случае клиент обменивается сервером дискретными блоками данных, при этом сообщения читается целиком.

ИК используют архитектуру клиент-сервер, где данные передаются в одном или двух направлениях. Сервер создает ИК и принимает соединение с клиентом. Клиент ИК – это процесс, устанавливающий соединение с существующим сервером. После этого сервер и клиент могут читать и записывать данные в ИК с помощью функций ReadFile и WriteFile.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26