Створення іменованих каналів

Тема: «Обмін даними іменованим каналом із сервером».

Робота з іменованими каналами.

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)дуже потрібно