Консультация № 172587
24.09.2009, 17:07
0.00 руб.
0 3 0
Дорогие эксперты помогите написать лабораторную работу. Заранее благодарен.

Написать программу, использующую API-функции ввода-вывода (CreateFile, ReadFile, и т.д.) и UNC-имена для работы с файлом по сети через редиректор Windows.
Реализовать следующие операции по работе с файлом:
1) Создание файла на сервере.
2) Запись информации в файл.
3) Чтение информации из файла, начиная с определенной позиции.
4) Вывод прочитанной информации на экран.




Лабораторная работа № 1
РЕДИРЕКТОР WINDOWS

Цель работы
Изучить возможности обмена информацией по сети с использованием стандартных служб ввода-вывода файловой системы Microsoft Windows (98, NT, 2000, XP).

Теоретические сведения
1. Редиректор.
Для доступа к локальным файлам приложения посылают запросы ввода-вывода драйверам файловой системы. Например, когда приложение открывает или закрывает файл, ОС определяет устройство, на котором находится данный файл, и передает запрос ввода-вывода локальному драйверу этого устройства. Аналогично осуществляется доступ к устройствам по сети, только запрос ввода-вывода передается по сети удаленному устройству, происходит перенаправление ввода-вывода.
Часть программного обеспечения операционной системы, которая распознает и перенаправляет запросы, относящиеся к удаленным ресурсам, по сети на другой компьютер, называется редиректором (redirector). Т.о., редиректор способен отличить запрос к удаленному ресурсу от запроса к локальному ресурсу.
На рисунке 1 показано взаимодействие программных компонентов при связи двух компьютеров. Клиент и сервер выполняют системные функции по обслуживанию запросов всех приложений компьютера А на удаленный доступ к ресурсу (принтеру, файлу, факсу) компьютера В. Чтобы приложения компьютера В могли пользоваться ресурсами компьютера А, схему нужно симметрично дополнить клиентом для компьютера В и сервером для компьютера А. В данном случае редиректором называется не весь клиентский модуль, а только его часть, предназначенная для распознавания.




Рис.1 Взаимодействие программных компонентов при связи двух компьютеров

В комплект Windows входит клиент для сетей Microsoft (Client for Microsoft Networks), ранее называвшийся Microsoft Networking Provider (MSNP), который обеспечивает связь между Windows NT4, 2000, XP, 95,98.
То, что редиректор работает так же, как и драйверы файловой системы, имеет целый ряд преимуществ. Приложения не должны заботиться о том, как расположены ресурсы (локально или удаленно). Они могут использовать для доступа к удаленным ресурсам те же API-функции, что и для доступа к локальным ресурсам. С точки зрения диспетчера ввода-вывода не существует разницы между доступом к файлу на локальном диске и к файлу на другом компьютере. Редиректор, как любой драйвер файловой системы, можно динамически загружать и выгружать.
Поскольку редиректор предоставляет средства ввода-вывода службам верхнего уровня, он скрывает детали работы сетевого и транспортного уровней от приложений. Поэтому приложения не должны передавать редиректору параметры, связанные с протоколами. В итоге приложения могут работать практически в любой сетевой конфигурации: поверх TCP/IP, NetBEUI, IPX/SPX, не зная деталей работы сетевых протоколов. Однако чтобы два приложения могли связаться по сети, их рабочие станции должны иметь хотя бы один общий протокол. Так, если на компьютере А установлен только TCP/IP, а на компьютере В – только IPX/SPX, то редиректор не сможет обеспечить связь между ними.

2. Универсальные правила именования.
Имена UNC (Universal Naming Convention) – это стандартный способ доступа к файлам и устройствам по сети без подключения этих объектов в качестве локального диска.
Имена UNC имеют вид
\\имя_компьютера\имя_общего_ресурса\путь\имя_файла,
где имя_компьютера – это имя удаленного компьютера, на котором находится нужный файл;
имя_ресурса – это имя общего ресурса, т. е. папки в файловой системе удаленного компьютера, которая выделена в общий доступ пользователям сети.

3. Протокол SMB.
Редиректор связывается с другими компьютерами, посылая сообщения серверной службе редиректора на этих компьютерах. Протокол, по которому редиректор отправляет и получает сообщения с удаленных компьютеров, называется Server Message Block File Sharing Protocol (Протокол совместного использования файлов на основе блоков сообщений сервера) или SMB. Структура данных SMB содержит три основных компонента: код команды, параметры команды, пользовательские данные.
Протокол SMB основан на модели клиент-сервер. Клиент редиректора создает структуру SMB с указанием типа запроса в поле кода команды. Если команда требует отправки данных (например, Write), то они прилагаются к запросу. Затем структура SMB отправляется по установленному транспортному протоколу (например, TCP/IP) серверной службе редиректора на удаленном компьютере. Эта служба обрабатывает запрос клиента и возвращает ему ответную структуру SMB.

4. Открытие и закрытие устройств.
Для осуществления ввода-вывода прежде всего надо открыть устройство и получить его описатель. Операционная система Windows, насколько это возможно, скрывает от разработчиков различия между устройствами. Для открытия файла, каталога, логического и физического диска, последовательного и параллельного порта используется API-функция CreateFile.
Функция CreateFile возвращает описатель файла. В дальнейшем этот описатель можно передавать другим API-функциям, чтобы обеспечить обмен данными с устройством.
Закончив работу с устройством, его следует закрыть. Для большинства устройств это делает функция CloseHandle.
Рассмотрим функцию CreateFile более подробно. Функция CreateFile определена следующим образом:
HANDLE CreateFile (
LPCTSTR IpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES IpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
Параметр IpFileName указывает 1) путь и имя файла или каталога, 2) имя в UNC-формате, 3) имя логического диска в виде «\\.\х:», 4) физический диск «\\.\PHYSICALDRIVEх», 5) последовательный порт «COMх», 6) параллельный порт «LPTх».
Параметр dwDesiredAccess определяет, как будет производиться обмен данными с устройством. Этому параметру можно присвоить одно из 4-х значений:
0 – считывание и запись данных на устройство производиться не будут;
GENERIC_READ – разрешает доступ к устройству только для чтения;
GENERIC_WRITE – разрешает доступ к устройству только для записи;
GENERIC_READ| GENERIC_WRITE - разрешает доступ для чтения и записи.
Параметр dwShareMode определяет привилегии при совместном использовании устройства, когда к нему возможен одновременный доступ нескольких сетевых компьютеров или нескольких процессов. Этому параметру можно присвоить одно из следующих значений:
0 – другие процессы не смогут считывать или записывать данные на устройство;
FILE_SHARE_READ – другие процессы не смогут записывать данные на устройство;
FILE_SHARE_WRITE – другие процессы не смогут считывать данные с устройства;
FILE_SHARE_READ| FILE_SHARE_WRITE - другие процессы смогут считывать или записывать данные на устройство, если оно свободно.
Параметр IpSecurityAttributes указывает на структуру SECURITY_ATTRIBUTES, позволяющую задать информацию о защите и определить, будет ли наследуемым описатель, возвращаемый CreateFile. Дескриптор защиты, содержащийся в этой структуре, применяется только при создании файла в защищенной файловой системе NTFS, в остальных случаях он игнорируется. Передаваемое значение NULL указывает, что файл создается с атрибутами защиты по умолчанию и возвращаемый описатель не может быть унаследован.
Параметр dwCreationDisposition обычно используется при открытии файлов, а не устройств других типов. Он может принимать следующие значения:
CREATE_NEW – функция CreateFile должна создать новый файл. Если файл с указанным именем уже существует, то функция не выполняется.
CREATE_ALWAYS - функция CreateFile должна создать новый файл. Если файл с указанным именем уже существует, то CreateFile его обнуляет.
OPEN_EXISTING - функция CreateFile должна открыть существующий файл или другое устройство. Если файла с указанным именем нет, то функция не выполняется.
OPEN_ALWAYS - функция CreateFile должна открыть файл, если он существует, или создать новый, если его нет.
TRUNCATE_EXISTING - функция CreateFile должна открыть существующий файл и обнулить его размер. Если файл не существует, то функция не выполняется.
При открытии с помощью CreateFile устройства, отличного от файла, значение параметра dwCreationDisposition должно быть OPEN_EXISTING.
Параметр dwFlagsAndAttributes используется для двух целей: он позволяет установить флаги для оптимизации взаимодействия с устройством, а также, если устройство является файлом, - установить его атрибуты.
Например, флаг FILE_FLAG_NO_BUFFERING указывает, что доступ к файлу должен производиться без буферизации данных. Установка этого флага иногда способна повысить скорость и оптимизировать использование памяти приложением. Флаг FILE_FLAG_OVERLAPPED задает асинхронный обмен данными с устройством. По умолчанию устройства открываются для синхронного ввода-вывода и данный флаг не устанавливается. При этом поток приостанавливает работу на время чтения данных из файла, ожидая, когда будет считана вся информация. Когда данные полностью считаны, поток снова получает управление и продолжает выполнение.
Параметр hTemplateFile передает описатель уже открытого файла или имеет значение NULL. Если он указывает описатель файла, то функция CreateFile использует атрибуты этого файла. При создании файла данный параметр игнорируется.

5. Перемещение указателя файла.
При обращении к CreateFile система создает объект, управляющий операциями, связанными с созданным файлом. Этот объект содержит указатель файла – 64-разрядное значение, указывающее начальную позицию, с которой будет выполняться следующая операция чтения или записи. Сначала указатель файла устанавливается равным 0, т.е. чтение или запись будут осуществляться с нулевой позиции. При выполнении операций ввода-вывода указатель файла сдвигается на соответствующее количество байт.
Если требуется доступ к файлу с произвольной позиции, изменить значение указателя файла можно с помощью функции SetFilePointerEx:
BOOL SetFilePointerEx(
HANDLE hFile;
LARGE_INTEGER liDistanceToMove;
PLARGE_INTEGER pliNewFilePointer;
DWORD dwMoveMethod);
Параметр hFile – это описатель файла.
Параметр liDistanceToMove задает количество байт, на которое необходимо передвинуть указатель файла. Может иметь отрицательное значение для перемещения к началу файла.
Последний параметр dwMoveMethod определяет, как трактовать параметр liDistanceToMove. Возможные значенеия:
FILE_BEGIN – указатель файла устанавливается равным значению параметра liDistanceToMove.
FILE_CURRENT – указатель файла увеличивается на liDistanceToMove.
FILE_END – указатель файла устанавливается равным сумме логического размера файла и значения параметра liDistanceToMove.
Параметр pliNewFilePointer указывает на структуру LARGE_INTEGER, в которую функция SetFilePointerEx записывает новое значение указателя файла. Если не предполагается использовать новое значение указателя, то можно передать NULL.

6. Реализация ввода-вывода.
Независимо от типа устройства ввод-вывод выполняется с помощью одних и тех же функций ReadFile и WriteFile.
BOOL ReadFile(
HANDLE hFile;
LPVOID lpBuffer;
DWORD nNumberOfBytesToRead;
LPDWORD lpNumberOfBytes;
LPOVERLAPPED lpOverlapped);

BOOL WriteFile(
HANDLE hFile;
LPCVOID lpBuffer;
DWORD nNumberOfBytesToWrite;
LPDWORD lpNumberOfBytes;
LPOVERLAPPED lpOverlapped);
Параметр hFile – это описатель устройства, к которому осуществляется доступ.
Параметр lpBuffer указывает на буфер, куда будут считываться или записываться данные.
Параметры nNumberOfBytesToRead и nNumberOfBytesToWrite указывают, сколько байт считать с устройства или записать на него.
Параметр lpNumberOfBytes – это адрес значения типа DWORD, в которое функция записывает число байтов, записанных или считанных с устройства.
Параметр lpOverlapped при выполнении синхронного ввода-вывода должен быть равен NULL.
При успешном завершении функции ReadFile и WriteFile возвращают TRUE.

Обсуждение

Неизвестный
24.09.2009, 17:37
общий
в описании лабораторной работы - теория
Неизвестный
24.09.2009, 17:45
общий
прокоментируйте код программы, please
давно
Старший Модератор
17042
808
24.09.2009, 21:52
общий
Новик Андрей Александрович:
Андрей Александрович! Вы, конечно, имеете право рассчитывать на помощь экспертов, но... "Помочь" и "решить за" - это всё-таки разные вещи. Экспертам обычно скучно решать студенческие задачи, особенно подобного объёма. Советую подумать о подаче вопроса в Решебник. Впрочем, Вы можете это сделать и по истечении 5 дней ожидания ответов на бесплатный вопрос...
Об авторе:
We have but faith: we cannot know;
For knowledge is of things we see;
And yet we trust it comes from thee,
A beam in darkness: let it grow.
-----
https://www.linkedin.com/in/andreynkuznetsov
https://www.researchgate.net/profile/Andrey_Kuznetsov11
http://www.researcherid.com/rid/K-8824-2014
Форма ответа