Поделиться через


Режимы открытия именованного канала

Сервер каналов задает режимы доступа, перекрытия и записи в параметре dwOpenModeCreateNamedPipe. Клиенты канала могут указать эти открытые режимы для дескрипторов канала с помощью функции createFile.

Режим доступа

Настройка режима доступа к каналу эквивалентна указанию доступа на чтение или запись, связанную с дескрипторами сервера каналов. В следующей таблице показан эквивалентный универсальный доступ для каждого режима доступа, который можно указать с помощью CreateNamedPipe.

Режим доступа Эквивалентное универсальное право доступа
PIPE_ACCESS_INBOUND GENERIC_READ
PIPE_ACCESS_OUTBOUND GENERIC_WRITE
PIPE_ACCESS_DUPLEX GENERIC_READ | GENERIC_WRITE

 

Если сервер канала создает канал с PIPE_ACCESS_INBOUND, канал доступен только для чтения для сервера канала и только записи для клиента канала. Если сервер канала создает канал с PIPE_ACCESS_OUTBOUND, канал доступен только для записи для сервера канала и доступен только для чтения для клиента канала. Канал, созданный с помощью PIPE_ACCESS_DUPLEX, является чтением и записью как для сервера канала, так и для клиента канала.

Клиенты канала, использующие CreateFile для подключения к именованной трубе, должны указать право доступа в параметре dwDesiredAccess, совместимом с режимом доступа, указанным сервером канала. Например, клиент должен указать GENERIC_READ доступ, чтобы открыть дескриптор для канала, созданного с помощью PIPE_ACCESS_OUTBOUND. Режимы доступа должны быть одинаковыми для всех экземпляров канала.

Для чтения атрибутов канала, таких как режим чтения или блокирующий режим, дескриптор канала должен иметь право доступа FILE_READ_ATTRIBUTES; для записи атрибутов канала дескриптор канала должен иметь право FILE_WRITE_ATTRIBUTES доступа. Эти права доступа можно объединить с универсальным правом доступа, подходящим для канала: GENERIC_READ с FILE_WRITE_ATTRIBUTES для канала только для чтения или GENERIC_WRITE с FILE_READ_ATTRIBUTES для канала только для записи. Ограничение прав доступа таким образом обеспечивает более высокую безопасность для канала.

Перекрываемый режим

В перекрываемом режиме функции, выполняющие длительные операции чтения, записи и подключения, могут возвращаться немедленно. Это позволяет потоку выполнять другие операции в фоновом режиме. Чтобы указать перекрываемый режим, используйте флаг FILE_FLAG_OVERLAPPED. Дополнительные сведения см. в синхронных и перекрывающихся входных и выходных данных.

Функция CreateFile позволяет клиенту канала задать перекрываемый режим (FILE_FLAG_OVERLAPPED) для дескрипторов канала с помощью параметра dwFlagsAndAttributes.

режим Write-Through

Укажите режим записи через FILE_FLAG_WRITE_THROUGH. Этот режим влияет только на операции записи в каналы типа байтов между клиентами каналов и серверами каналов на разных компьютерах. В режиме записи функции, записываемые в именованный канал, не возвращаются до передачи данных через сеть и в буфер канала на удаленном компьютере. Режим записи полезен для приложений, требующих синхронизации для каждой операции записи.

Если режим записи не включен, система повышает эффективность сетевых операций путем буферизации данных до минимального количества байтов или до истечения максимального периода времени. Буферизация позволяет системе объединять несколько операций записи в одну сетевую передачу. Это означает, что операция записи может быть успешно завершена после того, как система помещает данные в исходящий буфер, но до того, как система передает ее по сети.

Функция CreateFile позволяет клиенту канала задать режим записи (FILE_FLAG_WRITE_THROUGH) для дескрипторов канала с помощью параметра dwFlagsAndAttribut es. Режим записи дескриптора канала нельзя изменить после создания дескриптора канала. Режим записи может отличаться для серверных и клиентских дескрипторов для одного экземпляра канала.

Клиент канала может использовать функцию setNamedPipeHandleState для управления количеством байтов и периодом ожидания перед передачей канала, на котором отключен режим записи. Для канала только для чтения дескриптор канала должен быть открыт с помощью GENERIC_READ и FILE_WRITE_ATTRIBUTES прав доступа.