Створення іменованих каналів
Тема: «Обмін даними іменованим каналом із сервером».
Робота з іменованими каналами.
p align="justify"> Робота з іменованими каналами також як і робота з анонімними каналами вимагає спільного використання цілого ряду функцій. Тому спочатку розглянуті всі функції, які призначені для роботи з іменованими каналами, а потім наведено кілька прикладів, що ілюструють використання цих функцій.
Створення іменованих каналів.
Іменовані канали створюються процесом-сервером за допомогою функціїCreateNamedPipe, яка має наступний прототип:
LPCTSTR lpName // ім'я каналу
DWORD dwOpenMode, // атрибути каналу
DWORD dwPipeMode, // режим передачі даних
DWORD nMaxInstances, // максимальна кількість екземплярів каналу
DWORD nOutBufferSize // розмір вихідного буфера
DWORD nInBufferSize // розмір вхідного буфера
DWORD nDefaultTimeOut, // час очікування зв'язку з клієнтом
LPSECURITY_ATTRIBUTES lpPipeAttributes // атрибути захисту
де параметри мають такі значення.
Параметр lpName вказує на рядок, який повинен мати вигляд:
Тут точка (.) означає локальну машину, оскільки новий іменований канал завжди створюється на локальній машині, слово pipe – фіксоване, а
позначає ім'я каналу, яке задається користувачем і нечутливе до регістру.
Параметр dwOpenMode задає прапори, які визначають напрямок передачі даних, буферизацію, синхронізацію обміну даними та права доступу до іменованого каналу. Для визначення напряму передачі використовуються прапори:
- PIPE_ACCESS_DUPLEX читання та запис у канал,
- PIPE_ACCESS_INBOUND клієнт пише, асервер читає дані,
- PIPE_ACCESS_OUTBOUND сервер пише, а клієнт читає дані.
Прапор, що визначає напрямок передачі даних іменованим каналом, повинен збігатися для всіх екземплярів одного і того ж іменованого каналу. Для визначення способу буферизації та синхронізації використовуються прапори:
- FILE_FLAG_WRITE_THROUGH забороняє буферизацію під час передачі даних по мережі.
- FILE_FLAG_OVERLAPPED дозволяє асинхронну передачу даних каналом.
Ці прапори можуть бути різними для кожного екземпляра одного і того ж іменованого каналу. Прапори визначення атрибутів захисту будуть розглянуті пізніше.
Параметр dwPipeMode задає прапори, спосіб передачі даних іменованим каналом. Для визначення способів читання та запису даних у іменований канал використовуються прапори:
- PIPE_TYPE_BYTE запис даних потоком,
- PIPE_TYPE_MESSAGE запис даних повідомлень.
- PYPE_READMODE_BYTE читання даних потоком,
- PYPE_READMODE_MESSAGE читання даних повідомлень.
За замовчуванням дані за іменованим каналом віддаються потоком. Прапори способів читання та запису даних у іменований канал повинні збігатися всім екземплярів одного й того самого іменованого каналу. Для визначення синхронізації доступу до іменованого каналу використовуються прапори:
- PIPE_WAIT синхронний зв'язок з каналом та обмін даними по каналу,
- PIPE_NOWAIT асинхронний зв'язок з каналом та обмін даними по каналу.
Ці прапори можуть бути різними для кожного екземпляра іменованого каналу.
Параметр nMaxInstances визначає максимальну кількість екземплярів іменованого каналу, що може перебувати в межах від 1 до PIPE_UNLIMITED_INSTANCES.
Параметри nOutBufferSize та nInBufferSize визначаютьвідповідно розміри вихідного та вхідного буферів для обміну даними по іменованому каналу. Однак ці значення розглядаються операційними системами Windows лише як побажання користувача, а сам вибір розмірів буферів залишається за операційною системою.
Параметр nDefaultTimeOut встановлює час очікування клієнтом зв'язку з сервером, якщо клієнт викликає функцію WaitNamedPipe, де інтервал очікування інтервал очікування задається за замовчуванням.
При вдалому завершення функція CreateNamedPipe повертає значення дескриптор іменованого каналу, у разі невдачі – одне із двох значень:
- INVALID_HANDLE_VALUE невдале завершення,
- ERROR_INVALID_PARAMETR значення параметра nMaxInstances більше, ніж PIPE_UNLIMITED_INSTANCES.
Для зв'язку сервера з кількома клієнтами за одним іменованим каналом сервер має створити кілька екземплярів цього каналу. Кожен екземпляр іменованого каналу створюється викликом функції CreateNamedPipe, у якій деякі прапори мають бути встановлені однаково всім екземплярів одного й того самого іменованого каналу. Кожен новий виклик цієї функції повертає новий дескриптор на створюваний екземпляр іменованого каналу.
Чи не знайшли те, що шукали? Скористайтеся пошуком:
Вимкніть adBlock! і оновіть сторінку (F5)дуже потрібно