Именованные каналы для двунаправленного межпроцессного обмена нетипизированными данными между двумя Windows-машинами

Страницы работы

Содержание работы

Лекция №7

Именованные каналы

Именованный канал обеспечивает двунаправленный межпроцессный обмен нетипизированными данными между двумя Windows-машинами. Наиболее распространенное применение именованных каналов – это передача информации из одного источника одному получателю, обычно через сеть, на Windows-компьютеры.

Серверная часть может принимать запросы от множества клиентских. Клиент посылает строку серверу, сервер отвечает – изменяет строку.

Функции, используемые в  следующей программе:

CallNamedPipe

CallNamedPipe – функция CallNamedPipe соединяется с сообщением-типом канала (и ждет, если экземпляр канала недоступен). Считывает в канал и записывает с канала, а потом закрывает канал.

Описание этой функции:

BOOL CallNamedPipe(
LPCTSTRlpNamedPipeName// указатель на именованный канал
LPVOIDlpInBuffer,        // указатель на записываемый буфер 
DWORDnInBufferSize,      // размер, в байтах, записываемого буфера
LPVOIDlpOutBuffer,       // указатель на считываемый буфер
DWORDnOutBufferSize,     // размер, в байтах, считываемого буфера
LPDWORDlpBytesRead,      // указатель на считываемое количество байтов
  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

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

HANDLE CreateNamedPipe(
LPCTSTRlpName,         // Указатель на имя канала
  DWORD dwOpenMode,       // канал открывает режим
  DWORD dwPipeMode,       // pipe-specific режимы
  DWORD nMaxInstances,    // максимальное число запросов
DWORDnOutBufferSize,   // выводимый размер буфера, в байтах
DWORDnInBufferSize,    // вводимый размер буфера, в байтах
  DWORD nDefaultTimeOut// time-out время, в миллисекундах
  LPSECURITY_ATTRIBUTES lpSecurityAttributes  //указатель на атрибуты безопасности
);
 
Параметры:
 

lpName – указатель на строку с завершающим нулем, который однозначно идентифицирует канал. Строка должна иметь следующую форму:

\\.\pipe\pipename

часть имени pipename может включать любой другой символ после backslash, включая числа и специальные символы. Сплошная строка имени канала не должна превышать 256 символов.

dwOpenMode – описатель режима доступа канала, режим с наложением, режим сквозной записи (одновременное занесение данных в КЭШ и ОЗУ) и безопасность режима доступа дескриптора канала. 

CreateNamedPipeвозвращает ошибку, если dwOpenMode-описатель – любой-другой из флагов, не приведенных в ниже перечисленном списке.

Этот параметр должен включать один из ниже перечисленных флагов режимов доступа канала. Эти же режимы должны быть определены для каждого экземпляра канала:

Похожие материалы

Информация о работе