Лабораторна робота №2
Тема: Поштові скриньки. Іменовані канали
Теоретичні відомості
Поштові скриньки
В Microsoft Windows реалізований простий однонапрямлений механізм зв’язку, який називається поштовими скриньками. Поштова скринька – це файл, який створюється в оперативній пам’яті комп’ютера програмою-сервером. Поштові скриньки дозволяють клієнтському процесу передавати повідомлення одному або декільком серверним процесам. Розробка програм, які використовують поштові скриньки не вимагає знань транспортних протоколів, таких як TCP/IP або IPX. Разом з тим поштові скриньки не гарантують надійної передачі даних, оскільки основані на архітектурі широкомовлення, але вони є корисними, коли доставка даних не є життєво важливою.
Поштові скриньки основані на інтерфейсі файлової системи Windows. Клієнтська та серверна програми використовують стандартні функції файлової системи Win32 (такі як ReadFile та WriteFile) для відправки та отримання повідомлень, а також правила іменування файлової системи Win32. Це значить, що поштові скриньки іменуються за таким правилом:
\\сервер\Mailslot\[шлях]ім’я , де:
\\сервер – ім’я сервера;
\Mailslot – фіксований обов’язковий рядок, що показує, що це – поштова скринька;
\[шлях]ім’я – дозволяє програмам унікально ідентифікувати ім’я поштової скриньки.
Рядок Mailslot може являти собою крапку (.) – локальний комп’ютер, зірочку (*) – усі комп’ютери локальної мережі, ім’я домена або сервера.
Усі API-функції Win32, що використовуються при розробці клієнтів та серверів поштових скриньок (за винятком CreateFile та CreateMailslot), у випадку невдачі повертають 0. API-функції CreateFile та CreateMailslot повертають значення INVALID_HANDLE_VALUE у випадку невдачі.
Сервер поштової скриньки
Для реалізації поштової скриньки необхідно написати базову серверну програму, де виконати такі дії:
Створити описувач поштової скриньки за допомогою API-функції CreateMailslot;
Отримати дані від будь-якого клієнта шляхом виклику функції ReadFile з описувачем поштової скриньки у якості параметра;
Закрити описувач поштової скриньки за допомогою API-функції CloseHandle.
Наведемо опис даних функцій:
HANDLE CreateMailslot(
LPCTSTR lpName,
DWORD nMaxMessageSize,
DWORD lReadTimeout,
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
lpName – задає ім’я поштової скриньки (наприклад \\.\Mailslot\slots\mymailslot);
nMaxMessageSize – задає максимальний розмір повідомлення в байтах, яке може бути записане в поштову скриньку. Якщо 0, то приймаються повідомлення будь-якого розміру;
lReadTimeout - задає час (в мілісекундах), протягом якого операції читання чекають вхідних повідомлень. Значення MAILSLOT_WAIT_FOREVER дозволить заблокувати операції читання і примусить чекати, поки вхідні дані не будуть доступні для читання. Якщо 0 – операції читання повертаються негайно.
LpSecurityAttributes – визначає права доступу. Повинен бути NULL.
Сервер – єдиний процес, який може читати дані з поштової скриньки. Для цього він викликає функцію ReadFile.
BOOL ReadFile(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped);
hFile – описувач, який повертає функція CreateMailslot;
lpBuffer та nNumberOfBytesToRead – визначають, скільки даних може бути зчитано з поштової скриньки;
lpNumberOfBytesRead – повертає кількість фактично зчитаних байт по завершенню функції ReadFile;
lpOverlapped – дозволяє зчитувати дані із поштової скриньки асинхронно. Використовує механізм перекритого вводу-виводу.
