Программирование для Windows NT (том 2)

Функция SetNamedPipeHandleState


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

BOOL SetNamedPipeHandleState(

  HANDLE  hNamedPipe, // идентификатор канала Pipe

  LPDWORD lpdwMode,   // адрес переменной, в которой указан

                      // новый режим канала

  LPDWORD lpcbMaxCollect, // адрес переменной, в которой

                      // указывается максимальный размер

                      // пакета, передаваемого в канал

  LPDWORD lpdwCollectDataTimeout); // адрес максимальной

                      // задержки перед передачей данных

Параметр hNamedPipe задает идентификатор канала Pipe, режим работы которого будет изменен.

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



Константа

Использование канала

PIPE_READMODE_BYTE

Канал открывается на чтение в режиме последовательной передачи отдельных байт

PIPE_READMODE_MESSAGE

Канал открывается на чтение в режиме передачи отдельных сообщений указанной длины

PIPE_WAIT

Канал будет работать в блокирующем режиме, когда процесс переводится в состояние ожидания до завершения операций в канале

PIPE_NOWAIT

Неблокирующий режим работы канала. Если операция не может быть выполнена немедленно, в неблокирующем режиме функция завершается с ошибкой

Константы PIPE_WAIT и PIPE_NOWAIT, задающие блокирующий и неблокирующий режим соответственно, можно комбинировать при помощи логической операции ИЛИ с константами PIPE_READMODE_BYTE и PIPE_READMODE_MESSAGE.

Если текущий режим работы канала изменять не нужно, для параметра lpdwMode следует указать значение NULL.

Теперь рассмотрим назначение параметра lpcbMaxCollect.

Если при открытии канала клиентским процессом функцией CreateFile не была указана константа FILE_FLAG_WRITE_THROUGH, то данные передаются пакетами, которые собираются из отдельных сообщений. Размер такого пакета как раз и определяет параметр lpcbMaxCollect.

В том случае, когда вы не собираетесь изменять размер пакета, укажите для параметра lpcbMaxCollect значение NULL.

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

В случае успешного завершения функция SetNamedPipeHandleState возвращает значение TRUE, а при ошибке - FALSE. Код ошибки можно получить, вызвав функцию GetLastError.



Содержание раздела