Лекция №7
Именованные каналы
Именованный канал обеспечивает двунаправленный межпроцессный обмен нетипизированными данными между двумя Windows-машинами. Наиболее распространенное применение именованных каналов – это передача информации из одного источника одному получателю, обычно через сеть, на Windows-компьютеры.
Серверная часть может принимать запросы от множества клиентских. Клиент посылает строку серверу, сервер отвечает – изменяет строку.
Функции, используемые в следующей программе:
CallNamedPipe – функция CallNamedPipe соединяется с сообщением-типом канала (и ждет, если экземпляр канала недоступен). Считывает в канал и записывает с канала, а потом закрывает канал.
Описание этой функции:
BOOL CallNamedPipe(LPCTSTRlpNamedPipeName, // указатель на именованный канал
LPVOIDlpInBuffer, // указатель на записываемый буфер
DWORDnInBufferSize, // размер, в байтах, записываемого буфера
LPVOIDlpOutBuffer, // указатель на считываемый буфер
DWORDnOutBufferSize, // размер, в байтах, считываемого буфера
LPDWORDlpBytesRead, // указатель на считываемое количество байтов
DWORDnTimeOut// time-out значение, в миллисекундах
);
Параметры:
lpNamedPipeName – указатель на строку с
завершающим нулем, специфицирующую именованный канал.
lpInBuffer – указатель на буфер, который содержит данные, записываемые в канал.
nInBufferSize – описатель размера, в байтах, записываемого буфера.
lpOutBuffer – указатель на буфер, который получает считываемые данные с канала.
nOutBufferSize – описатель размера, в байтах, считываемого буфера.
lpBytesRead – указатель на 32-битное значение, которое получает количество байт, считываемые с канала.
nTimeOut – описатель количества миллисекунд, в течение которого ожидается доступ к именованному каналу. Кроме числовых значений могут быть специфицированные ниже перечисленные специальные значения:
|
Значение |
Пояснение |
|
NMPWAIT_NOWAIT |
Нет ожидания для именованного канала. Если именованный канал не доступен, функция возвращает ошибку. |
|
NMPWAIT_WAIT_FOREVER |
Ожидания неограниченны. |
|
NMPWAIT_USE_DEFAULT_WAIT |
Используется time-out по умолчанию, оговоренное в вызове CreateNamedPipeфункции. |
Возвращаемые значения:
Если функция завершилась удачно, то возвращаемое значение – отличное от нуля.
Если функция завершилась неудачно, возвращаемое значение – 0. Для получения более детальной информации вызовите GetLastError.
Замечания:
Вызов CallNamedPipeэквивалентен вызовуCreateFile (или WaitNamedPipe, если CreateFile не может открыть канал непосредственно), TransactNamedPipe, и CloseHandleфункции.
Если сообщение, записанное в канал серверным процессом длиннее, чем nOutBufferSize, CallNamedPipe возвращает FALSE и GetLastError возвращает ERROR_MORE_DATA. Остаток от сообщения отбрасывается, потому что CallNamedPipe закрывает дескриптор канала до возврата.
CallNamedPipe неудачна, если канал типа байт.
CreateNamedPipe-функция создает экземпляр именованного канала и возвращает дескриптор следующим операциям канала. Именованный канал серверного процесса использует эту функцию либо для создания первого экземпляра специфического именованного канала, либо для установки основных атрибутов, или создания новых экземпляров имеющихся именованных каналов.
HANDLECreateNamedPipe(
LPCTSTRlpName, // Указатель на имя канала
DWORDdwOpenMode, // канал открывает режим
DWORDdwPipeMode,// pipe-specific режимы
DWORDnMaxInstances,// максимальноечислозапросов
DWORDnOutBufferSize, // выводимый размер буфера, в байтах
DWORDnInBufferSize, // вводимый размер буфера, в байтах
DWORDnDefaultTimeOut,// time-out время, вмиллисекундах
LPSECURITY_ATTRIBUTESlpSecurityAttributes//указательнаатрибутыбезопасности
); Параметры:
lpName – указатель на строку с завершающим нулем, который однозначно идентифицирует канал. Строка должна иметь следующую форму:
\\.\pipe\pipename
часть имени pipename может включать любой другой символ после backslash, включая числа и специальные символы. Сплошная строка имени канала не должна превышать 256 символов.
dwOpenMode – описатель режима доступа канала, режим с наложением, режим сквозной записи (одновременное занесение данных в КЭШ и ОЗУ) и безопасность режима доступа дескриптора канала.
CreateNamedPipeвозвращает ошибку, если dwOpenMode-описатель – любой-другой из флагов, не приведенных в ниже перечисленном списке.
Этот параметр должен включать один из ниже перечисленных флагов режимов доступа канала. Эти же режимы должны быть определены для каждого экземпляра канала:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.