Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prakt-Storozhok.docx
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
8 Мб
Скачать
☆

1. Теоретическое введение

В теоретическом введении рассматриваются следующие вопросы.

  • Структура имен mailslots.

  • API-функции для разработки сервера почтовых ящиков.

  • API-функции для разработки клиента почтовых ящиков.

    1. Имена почтовых ящиков.

Почтовые ящики именуются по следующему правилу:

\\ сервер \ Mailslot \ [путь] имя

где - \\сервер – имя сервера, на котором создается почтовый ящик и выполняется серверное приложение;

\ Mailslot - фиксированная обязательная строка, уведомляющая систему, что это имя почтового ящика;

\[путь]имя – позволяет приложениям уникальным образом определять и идентифицировать имя почтового ящика. В строке путь разрешается задавать несколько уровней каталогов.

Например, допустим следующие типы имен почтовых ящиков:

\\Oreo\Mailslot\Mymailslot;

\\Testserve r\Mailslot\Cooldirectory\Funtest\Anothermailslot;

\\.\Mailslot\Easymailslot;

\\*\Mailslot\Myslot.

Строка сервер может представлять собой точку (.),звездочку (*), имя домена или сервера. Домен – это группа рабочих станций и серверов с общим групповым именем

1.2. Сервер почтовых ящиков

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

1) Создать описатель почтового ящика с помощью АРI-функции CreateMailslot.

  1. Получить данные от любого клиента путем вызова API-функции ReadFile с описателем почтового ящика в качестве параметра.

  2. Закрыть описатель почтового ящика с помощью API-функции CloseHandle.

Серверные процессы создают почтовые ящики с помощью вызова API-функции Create Mailslot, которая определена следующим образом:

function CreateMailslot(

lpName: PChar: nMaxMessageSize: DWORD;

IReadTimeout: DWORD;

IpSecurityAttributes: PSecurityAttributes

): THandle; stdcall;.

Параметр IpName задает имя почтового ящика. Оно должно иметь сле­дующий вид: \\.\Mailslot\[путь]имя.

Заметьте: имя сервера представлено точкой, что означает локальный компьютер. Это необходимо, поскольку нельзя создать почтовый ящик на удаленном компьютере. В параметре LpName имя обязательно уникально, но может быть простым или включать полный путь.

Параметр nMaxMessageSize задает максимальный размер (в байтах) со­общения, которое может быть записано в почтовый ящик. Если клиент за­писывает сообщение большего размера, сервер не видит это сообщение. Если задать значение 0, то сервер будет принимать сообщения любого размера.

Операции чтения могут выполняться с блокировкой почтового ящика или без таковой, в зависимости от параметра lReadTimeout, задающего ко­личество времени (в миллисекундах), в течение которого операции чтения ждут входящих сообщений. Значение MAILSLOT_WAIT_FOREVER позво­лит заблокировать операции чтения и заставит их бесконечно ожидать, пока входящие данные не станут доступны для чтения. Если задать значе­ние 0, операции чтения возвращаются немедленно.

Параметр IpSecurityAttributes определяет права доступа к почтовому ящику. В Windows 98 он должен иметь значение nil, потому что в этих ОС система безопасности к объектам не применима. В Windows NT и Windows 2000 этот параметр реализован частично, поэтому следует также присвоить ему Nil.

После создания почтового ящика с действительным описателем можно читать данные. Сервер - единственный процесс, который может читать данные из почтового ящика. Для этого он должен вызвать Win32-функцию Readfile, определенную так:

function ReadFile(

hFile: THandle;

var Buffer;

nNumberOfBytesToRead: DWORD;

var IpNumberOfBytesRead: DWORD;

lpOverlapped: POverlapped

): BOOL; stdcall;.

CreateMailslot возвращает описатель hFile.

Параметры lpBuffer и nNumberOfBytesToRead определяют, сколько дан­ных может быть считано из почтового ящика. Важно задать размер этого буфера большим, чем параметр nMaxMessageSize из API-вызова CreateMailslot. Кроме того, размер буфера должен превышать размеры входящих сообщений, иначе ReadFile выдаст код ошибки ERROR_INSUFFICIET_BUFFER.

Параметр IpNumberOfBytes возвращает количество считанных байтов по завершении работы ReadFile.

Параметр IpOverlapped позволяет считывать данные из почтового ящи­ка асинхронно. Он использует Win32 — механизм перекрытого ввода-вывода (overlapped I/O). По умолчанию, выполнение ReadFile бло­кирует (ожидает) ввод-вывод, пока данные не станут доступны для чтения. Перекрытый ввод-вывод применим только в Windows NT и Windows 2000, в Windows 95 или Windows 98. Присвойте параметру lpQverlapped значе­ние Nil.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]