NPFS (Named Pipe File System)

Named Pipe File System является виртуальной файловой системой, которая управляет каналами named pipes.

· Каналы named pipes относятся к классу файловых объектов (API Win32).

· RPC реализован как надстройка над NPFS;

· Канал представляет собой виртуальное соединение, по которому передается информация от одного процесса к другому.

· Канал может быть однонаправленным или двунаправленным (дуплексным).

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

Серверный процесс создает канал на локальном компьютере с помощью функции программного интерфейса Win32 "CreateNamedPipe".

Серверный процесс активизирует канал при помощи функции "ConnectNamedPipe", после чего к каналу могут подключаться клиенты.

Далее производится подключение к каналу \\computer_name\pipe\pipe_name посредством вызова функции "Create File".

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

HANDLE CreateNamedPipe (

LPCTSTRlpName,
DWORDdwOpenMode,
DWORDdwPipeMode,
DWORDnMaxInstances,
DWORDnOutBufferSize,
DWORDnInBufferSize,
DWORDnDefaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes

);

Параметры создания канала:

· lpName – имя именованного канала;

· dwOpenMode – определяет направление передачи, возможные варианты - PIPE_ACCESS_DUPLEX, PIPE_ACCESS_INBOUND, PIPE_ACCESS_OUTBOUND ;

· dwPipeMode – способ передачи информации (PIPE_TYPE_BYTE или PIPE_TYPE_MESSAGE

· nMaxInstances – количество каналов с данным именем которые может открыть пользователь;

· nOutBufferSize и nInBufferSize – размер буферов приема и отправки;

· nDefaultTimeout – максимальное время ожидания при асинхронном вводе/выводе через канал;

· lpSecurityAttributes – указатель на структуру SECURITY_ATTRIBUTES, которая задает уровень защиты создаваемого объекта.

Подключение к именованному каналу

BOOL ConnectNamedPipe (

HANDLEhNamedPipe,
LPOVERLAPPED lpOverlapped

);

BOOL DisconnectNamedPipe (

HANDLE hNamedPipe

);

После того как канал создан, сервер подключается к нему с помощью функции ConnectNamedPipe () и начинает ожидать подключения клиента. Необходимо отметить, что подключение сервера к каналу может осуществляться как синхронным, так и асинхронным способом. В первом случае ConnectNamePipe возвращает управление программе лишь после того, как клиент подключился к каналу, во втором же случае, возврат управления происходит сразу же, а уведомление программы о подключении осуществляется через структуру OVERLAPPED , указатель на которую передается вторым параметром в ConnectNamedPipe. После завершения обмена необходимо отключиться от канала с помощью функции DisconnectNamedPipe. Затем можно снова открыть канал и ожидать подключения следующего клиента, а по завершению работы с каналом необходимо закрыть его дескриптор функцией CloseHandle ().

Обмен данными по именованному каналу

BOOL ReadFile/WriteFile (

HANDLEhFile,
LPVOIDlpBuffer,
DWORDnNumberOfBytesToRead,
LPDWORDlpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped

);

Работа с каналом и ее завершение

После установления виртуального соединение серверный процесс и клиентский процесс могут обмениваться информацией при помощи пар функций "ReadFile" и "WriteFile". При помощи одного и того же канала сервер может одновременно обслуживать нескольких клиентов. Для этого серверный процесс может создать N-ное количество экземпляров канала, вызвав N-ное количество раз функцию "CreateNamedPipe" (при этом в каждом вызове должно быть указано одно и то же имя канала). Клиентский процесс может отключиться от канала в любой момент с помощью функции "CloseHandle". Серверный процесс может отключить клиента в любой момент с помощью функции "DisconnectNamedPipe".

Почтовые ящики (MailSlots)

Mailslot является одним из механизмов, предназначенных для осуществления обмена данными между процессами (IPC). При этом процессы могут быть запущены как на одной ПЭВМ (локально), так и разных ПЭВМ, включённых в одну ЛВС (удалённо). Приложение-сервер открывает почтовый ящик, а клиенты могут писать в него. Ящик сохраняет сообщения до тех пор, пока сервер их не прочтет. Разумеется, одно приложение может одновременно быть сервером и клиентом, обеспечивая двунаправленную связь. При этом приложения могут находиться даже на разных компьютерах в сети. Mailslot представляет собой псевдофайл, хранящийся в памяти. Для доступа к данным, содержащимся в этом псевдофайле, используются стандартные файловые функции Win32. Объект Mailslot является временным объектом. После того, как будет закрыт последний дескриптор, ссылающийся на объект Mailslot, сам объект с данными будет уничтожен. Обмен данными посредством Mailslot осуществляется в большинстве случаев между двумя процессами – клиентом и сервером. При создании объекта Mailslot сервером, имя объекта должно иметь следующий формат: \\.\mailslot\[path]name Имя объекта Mailslot должно содержать две наклонные черты влево, точку, ещё одну наклонную черту влево, слово «mailslot» и последнюю наклонную черту. После последней наклонной черты указывается собственно имя создаваемого объекта. Имя может также содержать путь. Примеры имени создаваемого объекта Mailslot:

1. \\.\mailslot\Test.msl

2. \\.\mailslot\SampleDir\Sample

Форматы имени клиента

Для того чтобы записать сообщение в Mailslot, клиент обращается к нему по имени. При этом если клиент и сервер запушены на одной ПЭВМ, то формат имени, используемый клиентом, может совпадать с форматом имени сервера. Однако чаще необходимо записывать сообщения в удалённый Mailslot, для чего необходимо использовать следующий формат имени объекта Mailslot: \\ComputerName\mailslot\Test.msl Здесь ComputerName – сетевое имя ПЭВМ, на которой расположен сервер Mailslot. Для того чтобы клиент мог поместить сообщение в каждый Mailslot с данным именем, созданный в пределах домена, формат имени объекта Mailslot для клиента должен быть следующим: \\DomainName\mailslot\Test.msl

Здесь DomainName – имя домена, включающие в себя те ПЭВМ, на которых запущены серверы Mailslot. Для того чтобы клиент мог поместить сообщение в каждый Mailslot с данным именем в первичном системном домене, имя объекта Mailslot должно иметь следующую форму: \\*\mailslot\Test.msl

Клиенты, сервера и имена

MailSlot cервер – является процессом, который создает и, обладает MailSlot. Когда сервер создает MailSlot, он получает указатель. Этот указатель должен использоваться, когда процесс читает сообщения от MailSlot. Только процесс, который создает MailSlot или получил указатель некоторым другим механизмом может прочитать данные из MailSlot. Все MailSlot локальные на процессе, который создает их; процесс не может создать дистанционный MailSlot.

MailSlot клиент – является процессом, который пишет сообщение в MailSlot. Любой процесс, который имеет имя MailSlot может записать в него информацию.

Наши рекомендации