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

Тема: «Обмен данными по именованному каналу с сервером».

Работа с именованными каналами.

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

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

Именованные каналы создаются процессом-сервером при помощи функции CreateNamedPipe, которая имеет следующий прототип:

HANDLE CreateNamedPipe (

LPCTSTR lpName, // имя канала

DWORD dwOpenMode, // атрибуты канала

DWORD dwPipeMode, // режим передачи данных

DWORD nMaxInstances, // максимальное количество экземпляров канала

DWORD nOutBufferSize, // размер выходного буфера

DWORD nInBufferSize, // размер входного буфера

DWORD nDefaultTimeOut, // время ожидания связи с клиентом

LPSECURITY_ATTRIBUTES lpPipeAttributes // атрибуты защиты

);

где параметры имеют следующие значения.

Параметр lpName указывает на строку, которая должна иметь вид:

\\.\pipe\<pipe_name>

Здесь точка (.) обозначает локальную машину, так как новый именованный канал всегда создается на локальной машине, слово pipe – фиксировано, а <pipe_name> обозначает имя канала, которое задается пользователем и нечувствительно к регистру.

Параметр 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, в которой некоторые флаги должны быть установлены одинаково для всех экземпляров одного и того же именованного канала. Каждый новый вызов этой функции возвращает новый дескриптор на создаваемый экземпляр именованного канала.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: