Лекция №7
Именованные каналы
Именованный канал обеспечивает двунаправленный межпроцессный обмен нетипизированными данными между двумя Windows-машинами. Наиболее распространенное применение именованных каналов – это передача информации из одного источника одному получателю, обычно через сеть, на Windows-компьютеры.
Серверная часть может принимать запросы от множества клиентских. Клиент посылает строку серверу, сервер отвечает – изменяет строку.
Функции, используемые в следующей программе:
CallNamedPipe – функция CallNamedPipe соединяется с сообщением-типом канала (и ждет, если экземпляр канала недоступен). Считывает в канал и записывает с канала, а потом закрывает канал.
Описание этой функции:
BOOL CallNamedPipe(
LPCTSTR
lpNamedPipeName, // указатель на именованный канал
LPVOID
lpInBuffer, // указатель на записываемый буфер
DWORD
nInBufferSize, // размер, в байтах, записываемого буфера
LPVOID
lpOutBuffer, // указатель на считываемый буфер
DWORD
nOutBufferSize, // размер, в байтах, считываемого буфера
LPDWORD
lpBytesRead, // указатель на считываемое количество байтов
DWORD
nTimeOut
// 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-функция создает экземпляр именованного канала и возвращает дескриптор следующим операциям канала. Именованный канал серверного процесса использует эту функцию либо для создания первого экземпляра специфического именованного канала, либо для установки основных атрибутов, или создания новых экземпляров имеющихся именованных каналов.
HANDLE
CreateNamedPipe(
LPCTSTR
lpName, // Указатель на имя канала
DWORD
dwOpenMode, // канал открывает режим
DWORD
dwPipeMode
,
// pipe-specific режимы
DWORD
nMaxInstances
,
// максимальное
число
запросов
DWORD
nOutBufferSize, // выводимый размер буфера, в байтах
DWORD
nInBufferSize, // вводимый размер буфера, в байтах
DWORD
nDefaultTimeOut
,
// time-out время
, в
миллисекундах
LPSECURITY_ATTRIBUTES
lpSecurityAttributes
//указатель
на
атрибуты
безопасности
);
Параметры:
lpName – указатель на строку с завершающим нулем, который однозначно идентифицирует канал. Строка должна иметь следующую форму:
\\.\pipe\pipename
часть имени pipename может включать любой другой символ после backslash, включая числа и специальные символы. Сплошная строка имени канала не должна превышать 256 символов.
dwOpenMode – описатель режима доступа канала, режим с наложением, режим сквозной записи (одновременное занесение данных в КЭШ и ОЗУ) и безопасность режима доступа дескриптора канала.
CreateNamedPipeвозвращает ошибку, если dwOpenMode-описатель – любой-другой из флагов, не приведенных в ниже перечисленном списке.
Этот параметр должен включать один из ниже перечисленных флагов режимов доступа канала. Эти же режимы должны быть определены для каждого экземпляра канала:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.