Поштові канали передачі даних Mailslot

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Поштові канали передачі даних Mailslot

Способи організації передачі даних

Розглянемо простий спосіб організації передачі даних між різними процесами, заснований на використанні дейтаграмним каналів Mailslot.

Канали Mailslot дозволяють виконувати односторонню передачу даних від одного або декількох клієнтів до одного або декількох серверів.

Головна особливість каналів Mailslot полягає в тому, що вони, на відміну від інших засобів, розглянутих нами, дозволяють передавати дані в широкомовному режимі.

Це означає, що на комп'ютері або в мережі можуть працювати кілька серверних процесів, здатних отримувати повідомлення через канали Mailslot.

При цьому один клієнтський процес може посилати повідомлення одразу всім цим серверним процесам.

За допомогою каналів Pipe ви не зможете передавати дані даний пакет, тому що тільки два процеси можуть створити канал типу Pipe.

MailSlot - це файл, що знаходиться в пам'яті, доступ до якого здійснюється стандартними файловими функціями Win32. Дані в Mailslot можуть бути в будь-якій формі, але загальний розмір не може бути більше 64K.

Розрізняють два типи процесів: MailSlot-сервер і MailSlot-клієнт.

MailSlot-cервер - є процесом, який створює і володіє MailSlot. Коли сервер створює MailSlot, він отримує Хендлі.

Цей Хендлі повинен використовуватися, коли процес читає повідомлення від MailSlot. Тільки процес, який створює MailSlot або отримує Хендлі деяким іншим механізмом, може прочитати дані з MailSlot. Всі MailSlot локальні на процесі, який створює їх.

Процес не може створити дистанційний MailSlot.

MailSlot-клієнт - є процесом, який пише повідомлення в MailSlot. Будь-який процес, який має ім'я MailSlot може записати в нього інформацію

Таким чином, MailSlot представляє собою простий і односпрямований інтерфейс взаємодії між процесами. Процес-сервер може завести поштову скриньку і дати йому ім'я, глобальне в мережі. Будь-який клієнт може за допомогою операцій роботи з файлами відправити дані в цей ящик. Сервер, у міру необхідності, може читати передані йому дані. Крім цього, можливо широкомовна передача інформації клієнтом всіх серверів домену.

Розглянемо найбільш важливі функції програмного інтерфейсу Windows, призначені для роботи з каналами MailSlot, які зведемо в таблицю 1.

Таблиця 1

Функції для роботи з каналами MailSlot

п / п

Функція

Призначення


CreateMailslot

Створення каналу MailSlot


CloseHandle

Закриття Хендлі каналу


GetMailslot

Визначення поточного стану каналу Mailslot.


SetMailslot

Зміна часу очікування для каналу Mailslot після його створення

Створення каналу Mailslot

Канал Mailslot створюється серверним процесом за допомогою спеціально призначеної для цього функції CreateMailslot ().

Після створення серверний процес отримує Хендлі каналу Mailslot. Користуючись цим Хендлі, сервер може читати повідомлення, що посилаються в канал клієнтськими процесами.

Однак сервер не може виконувати над каналом Mailslot операцію запису, так як цей канал призначений тільки для односторонньої передачі даних - від клієнта до сервера.

Синтаксис функції наступний

HANDLE CreateMailslot (LPCTSTR lpName, DWORD nMaxMsgSize, DWORD lReadTimeout, LPSECURITY_ATTRIBUTES lpSecurityAttributes)

Параметри:

lpName - покажчик на рядок імені каналу Mailslot.

nMaxMsgSize - максимальний розмір повідомлення.

lReadTimeout - час очікування для читання.

lpSecurityAttributes - покажчик на атрибути захисту

Значення, що повертається. При успішному виконанні - Хендлі створеного каналу Mailslot, при помилці - INVALID_HANDLE_VALUEКод помилки уточнюється при виклику функції GetLastError ()

Через перший параметр lpName передаються функції CreateMailslot () покажчик на рядок символів з ​​ім'ям каналу Mailslot. Цей рядок має такий вигляд: \ \. \ Mailslot \ [Шлях] ІмяКанала

У цьому імені шлях є необов'язковою компонентою. Тим не менш, ви можете вказати його аналогічно тому, як це робиться для файлів. Що ж стосується імені каналу Mailslot, то воно задається аналогічно імені каналу Pipes.

Другий параметр nMaxMsgSize визначає максимальний розмір повідомлень, переданих через створюваний канал Mailslot.

Тут можна вказати нульове значення, при цьому розмір повідомлень не буде обмежений. Є, однак, один виняток - розмір широкомовних повідомлень, переданих всім робочих станцій і серверів домену не повинен перевищувати 400 байт.

За допомогою третього параметра lReadTimeout серверний додаток може задати час очікування для операції читання в мілісекундах, після закінчення якого функція читання поверне код помилки.

Якщо вказати в цьому параметрі значення MAILSLOT_WAIT_FOREVER, очікування буде нескінченним.

Четвертий параметр lpSecurityAttributes задає адресу структури захисту, який ми в наших програмах будемо вказувати як NULL.

Приклад 1

Уявімо використання функції CreateMailslot () в серверному додатку:

LPSTR lpszMailslotName = "\ \ \ \. \ \ Mailslot \ \ $ MailslotName $";

hMailslot = CreateMailslot (lpszMailslotName, 0, MAILSLOT_WAIT_FOREVER, NULL);

У цьому прикладі задано максимальний розмір повідомлення, тому на цю величину немає обмежень (крім обмеження в 400 байт для повідомлень, переданих всім комп'ютерам домену даний пакет).

Час очікування вказано як MAILSLOT_WAIT_FOREVER, тому функції, що працюють з даними каналом Mailslot будуть працювати в блокуючому режимі.

Відкриття каналу Mailslot

Перш ніж приступити до роботи з каналом Mailslot, клієнтський процес повинен його відкрити.

Для виконання цієї операції слід використовувати функцію CreateFile (), наприклад, так:

LPSTR lpszMailslotName = "\ \ \ \. \ \ Mailslot \ \ $ MailslotName $";

hMailslot = CreateFile (lpszMailslotName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);

Тут в якості першого параметра функції CreateFile () передається ім'я каналу Mailslot

Зауважимо, що можливо відкрити канал Mailslot, створений на інший робочої станції в мережі. Для цього рядок імені каналу, передана функції CreateFile (), повинна мати такий вигляд: \ \ ІмяРабочейСтанціі \ mailslot \ [Шлях] ІмяКанала

Можна відкрити канал для передачі повідомлень всім робочим станціям заданого домену. Для цього необхідно задати ім'я за наступним зразком: \ \ ІмяДомена \ mailslot \ [Шлях] ІмяКанала

Для передачі повідомлень одночасно всім робочим станціям мережі первинного домену ім'я задається наступним чином: ь \ \ * \ mailslot \ [Шлях] ІмяКанала

В якості другого параметра функції CreateFile () передається константа GENERIC_WRITE

Ця константа визначає, що над відкриваються каналом буде виконуватися операція запису.

Нагадаємо, що клієнтський процес може тільки посилати повідомлення в канал Mailslotно не читати їх звідти. Читання повідомлень з каналу Mailslot - завдання для серверного процесу.

Третій параметр вказаний як FILE_SHARE_READ, і це теж необхідно, тому що сервер може читати повідомлення, що посилаються одночасно кількома клієнтськими процесами.

Зверніть також увагу на константу OPEN_EXISTING. Вона використовується тому, що функція CreateFile () відкриває існуючий канал, а не створює новий.

Запис повідомлень в канал Mailslot

Запис повідомлень в канал Mailslot виконує клієнтський процес, викликаючи для цього функцію WriteFile. З цією функцією ми вже мали справу. Наприклад,

HANDLE hMailslot;

char szBuf [512];

DWORD cbWritten;

WriteFile (hMailslotszBuf, strlen (szBuf) + 1, & cbWritten, NULL);

В якості першого параметра цієї функції необхідно передати Хендлі каналу Mailslotполученний від функції CreateFile ().

Другий параметр визначає адресу буферу з повідомленням, третій - розмір повідомлення. У нашому випадку повідомлення передаються у вигляді текстового рядка, закритою двійковим нулем, тому для визначення довжини повідомлення була використана функція strlen.

Читання повідомлень з каналу Mailslot

Серверний процес може читати повідомлення зі створеного ним каналу Mailslot за допомогою функції ReadFile (), як це показано нижче:

HANDLE hMailslot char szBuf [512]; DWORD cbRead;

ReadFile (hMailslotszBuf, 512, & cbRead, NULL);

Через перший параметр функції ReadFile передається Хендлі створеного раніше каналу Mailslot, отриманий від функції CreateMailslot (). Другий і третій параметри задають, відповідно, адреса буфера для повідомлення і його розмір.

Зауважимо, що перед виконанням операції читання слід перевірити стан каналу Mailslot.

Якщо в ньому немає повідомлень, то функцію ReadFile () викликати не слід. Для перевірки стану каналу ви повинні скористатися функцією GetMailslotInfo ().

Визначення стану каналу Mailslot

Серверний процес може за його Хендлі за допомогою функції GetMailslotInfo (), синтаксис якої наступний

BOOL GetMailslotInfo (HANDLE hMailslot, LPDWORD lpMaxMessageSize, LPDWORD lpNextSize, LPDWORD lpMessageCount, LPDWORD lpReadTimeout)

Параметри:

hMailslot-Хендлі каналу Mailslot.

lpMaxMessageSize - адреса максимального розміру повідомлення.

lpNextSize - адреса розміру наступного повідомлення.

lpMessageCount - адреса кількості повідомлень.

lpReadTimeout - адреса часу очікування.

Значення, що повертається. При успішному виконанні - TRUE, при помилці - FALSE.

Через параметр hMailslot функції передається ідентифікатор каналу Mailslot, стан якого необхідно визначити.

Інші параметри задаються як покажчики на змінні типу DWORD, в які будуть записані параметри стану каналу Mailslot.

У змінну, адреса якої передається через параметр lpMaxMessageSize, після повернення з функції GetMailslotInfo () буде записаний максимальний розмір повідомлення.

Можна використовувати це значення для динамічного отримання буфера пам'яті, в який це повідомлення буде прочитано функцією ReadFile ()

У змінну, адреса якої вказана через параметр lpNextSize, записується розмір наступного повідомлення, якщо воно є в каналі. Якщо ж у каналі більше немає повідомлень, в цю змінну буде записана константа MAILSLOT_NO_MESSAGE

За допомогою параметра lpMessageCount можна визначити кількість повідомлень, записаних в канал клієнтськими процесами.

Якщо ця кількість дорівнює нулю, то не слід викликати функцію ReadFile () для читання неіснуючого повідомлення.

І, нарешті, в змінну, адреса якої задається в параметрі lpReadTimeout, записується поточний час очікування, встановлене для каналу (у мілісекундах).

Якщо не потрібна вся інформація, яку можна отримати за допомогою функції GetMailslotInfo (), деякі з її параметрів (крім, зрозуміло, першого) можна вказати як NULL.

Приклад 2. Демонстрація використання функції GetMailslotInfo ():

BOOL fReturnCode; DWORD cbMessages; DWORD cbMsgNumber;

fReturnCode = GetMailslotInfo (hMailslot, NULL, & cbMessages, & cbMsgNumber, NULL);

Зміна стану каналу Mailslot

За допомогою функції SetMailslotInfo () серверний процес може змінити час очікування для каналу Mailslot вже після його створення.

Синтаксис функції SetMailslotInfo () наступний:

BOOL SetMailslotInfo (HANDLE hMailslot, DWORD lpReadTimeout)

Параметри:

hMailslot-Хендлі каналу Mailslot.

lpReadTimeout - адреса часу очікування.

Значення, що повертається. При успішному виконанні - TRUE, при помилці - FALSE.

Через параметр hMailslot функції SetMailslot Info () передається ідентифікатор каналу Mailslot, для якого потрібно змінити час очікування.

Нове значення часу очікування в мілісекундах задається через параметр dwReadTimeout. Також можна вказати тут константи 0 або MAILSLOT_WAIT_FOREVER.

У першому випадку функції, що працюють з каналом, повернуть управління негайно, у другому - будуть знаходитися в стані очікування до тих пір, поки не завершиться виконувана операція.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Контрольна робота
40.6кб. | скачати


Схожі роботи:
Передача даних в інформаційно-керуючих системах Канали передачі даних
Передача даних в інформаційно керуючих системах Канали передачі даних
Невербальні канали передачі інформації
Системи мережі передачі даних
Канал послідовної передачі даних
Історія розвитку протоколів передачі даних
Протоколи передачі даних нижнього рівня
Інтерфейс передачі даних оптоволоконними каналами
Вибір та обгрунтування середовища передачі даних
© Усі права захищені
написати до нас