Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Именованные каналы



Именованные каналы обладают рядом особенностей, которые делают их удобным средством реализации приложений с использованием IPC. Особенности именованных каналов (некоторые из них присутствуют не всегда) перечислены ниже.

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

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

• Может быть несколько независимых экземпляров именованного канала. На­
пример, несколько клиентов могут связываться с одним сервером, используя
один и тот же канал, и сервер может ответить клиенту по тому же экземпляру
канала.

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

• Существует несколько функций-полуфабрикатов, упрощающих взаимодействие
по именованному каналу и соединение клиента с сервером.

Использование именованных каналов

Функция CreateNamedPipe создает первый экземпляр именованного канала и возвращает его дескриптор. Также эта функция определяет максимальное количество экземпляров канала и, следовательно, количество клиентов, которых можно обслужи­вать одновременно.

Обычно процесс создания называется сервером. Процессы-клиенты, возможно, работающие на других системах, открывают этот канал с помощью CreateFile.

Создание именованных каналов

Ниже приведена функция CreateNamedPipe.

HANDLE CreateNamedPipe (LPCTSTR lpszPipeName,

DWQRD fdwOpenMode, DWORD fdwPipeMode,

DWORD nMaxInstances, DWORD cbOutBuf, DWORD cblnBuf,

DWORD dwTimeOut, LPSECURITY_ATTRIBUTES lpsa)

Параметры

lpszPipeName обозначает имя канала в форме: \\.\pipe\[путь]имя-канала

Точка обозначает локальную машину; иначе говоря, создать канал на удаленной машине нельзя.

fdwOpenMode имеет одно из следующих значений:

- PIPE_ACCESS_DUPLEX — эквивалентно комбинации GENERIC_READ и GENERIC_WRITE;

- PIPE_ACCESS_INBOUND — направление данных только от клиента к серверу, эквивалентно GENERIC_READ;

- PIPE_ACCESS_OUTBOUND — эквивалентно GENERIC_WRITE.

Режим также может быть FILE_FLAG_WRITE_THROUGH (не используется для каналов сообщений) и FILE_FLAG_OVERLAPPED.

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

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

- PIPE_READMODE_BYTE и PIPE_READMODE_MESSAGE указывают, читаются ли данные как поток байтов или как поток сообщений. Для PIPE_READMODE_MESSAGE необходимо PIPE_TYPE_MESSAGE.

- PIPE_WAIT и PIPE_NOWAIT определяют, будет ли операция ReadFile блокироваться. Указывайте значение PIPE_WAIT, поскольку для асинхронного ввода-вывода есть способы получше.

nMaxInstances определяет количество экземпляров канала и, следовательно, ко­личество одновременно обслуживаемых клиентов. Если указать значение PIPE_UNLIMITED_ INSTANCES, количество ка­налов будет определять ОС в зависимости от доступных системных ресурсов.

cbOutBuf и cbInBuf задают размеры в байтах буферов ввода и вывода, используе­мых для именованных каналов. Если указать нуль, будут использоваться значения по умолчанию.

dwTimeOut — принятый по умолчанию тайм-аут (в миллисекундах) для функции WaitNamedPipe. Эта ситуация, в которой функция создания определяет тайм-аут для другой функции, является уникальной.

Возвращаемое значение в случае ошибки — INVALID_HANDLE_VALUE, так как дескрипторы каналов подобны дескрипторам файлов.

lpsa играет ту же роль, что и в других функциях создания.

При первом вызове CreateNamedPipe фактически создается именованный канал, а не просто экземпляр. При закрытии последнего дескриптора экземпляра сам этот экземпляр удаляется. Удаление последнего экземпляра именованного канала вызывает удаление самого канала.





Дата публикования: 2015-11-01; Прочитано: 520 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...