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


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

Сервер канала задает режимы доступа к каналу, перекрытия и записи в параметре dwOpenMode функции CreateNamedPipe . Клиенты канала могут указать эти открытые режимы для своих дескрипторов каналов с помощью функции 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) для дескрипторов канала с помощью параметра dwFlagsAndAttributes . Режим записи дескриптора канала нельзя изменить после создания дескриптора канала. Режим записи может отличаться для дескрипторов сервера и клиента для одного экземпляра канала.

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