Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Именованные каналы обладают рядом особенностей, которые делают их удобным средством реализации приложений с использованием 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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!