Составители:
передавать сообщения только в одном направлении: или от клиента к серверу, или от
сервера к клиенту (но не в обоих направлениях одновременно). Кроме того, анонимные
каналы не работают в сетях. Клиент и сервер должны находиться на одном компьютере.
Именованные каналы, которые поддерживаются в Windows NT, выполняют неко-
торые задачи, недоступные для анонимных каналов. Так, они передают информацию в
обоих направлениях, соединяют посредством сети процессы, происходящие на различ-
ных удаленных компьютерах. Кроме того, именованные каналы могут существовать в
нескольких экземплярах и имеют дополнительные режимы работы. Способность суще-
ствовать в нескольких экземплярах позволяет именованным каналам соединять один
сервер с несколькими клиентами. Каждый экземпляр канала представляет собой отдель-
ную независимую линию связи. Сообщения одного экземпляра канала не смешиваются с
сообщениями другого экземпляра. Несколько экземпляров канала создаются в том слу-
чае, когда один или несколько серверов передают одно и то же идентифицирующее имя
в качестве аргумента функции CreateNamedPipe().
8.2.2. API-функции для работы с каналами
Как уже было сказано выше, основное предназначение каналов - поддержка связи
между процессами. Канал представляет собой буфер в памяти, где система сохраняет
данные в период между записью их одним процессом и чтением другим. API-команды
позволяют трактовать буфер как канал, или трубу, по которой информация "перетекает"
из одного места в другое. Канал имеет два конца. Односторонний канал позволяет запи-
сывать данные только на одном своем конце и читать их на другом конце, т.е. вся ин-
формация "перетекает" от одного процесса к другому. Двухсторонние каналы дают воз-
можность обоим процессам выполнять как запись, так и чтение информации, поэтому
информация может "перетекать" одновременно в двух направлениях. Кроме того, при
создании канала необходимо принять решение о том, будет он анонимным или имено-
ванным [12].
Создание анонимных каналов. Анонимный канал передает информацию только в
одном направлении, причем оба конца канала должны находиться на одном и том же ло-
кальном компьютере. Процесс, создающий анонимный канал, получает два дескриптора:
для записи и для чтения. Чтобы связаться с каким-либо процессом, сервер должен пере-
дать ему один из дескрипторов.
BOOL CreatePipe( PHANDLE phRead, // переменная для дескриптора чтения
// (входной канал)
PHANDLE phWrite, // переменная для дескриптора записи
// (выходной канал)
LPSECURITY_ATTRIBUTES lpsa, // привилегии доступа
DWORD dwPipeSize ); // размер буфера канала (0 по умолчанию)
От размера буфера канала зависит, какой максимальный объем информации может
находиться в канале. Передача сообщений по заполненному каналу невозможна до тех
Пор, пока на другом конце канала не будет прочитана старая информация.
При успешном завершении функция CreatePipe() возвращает значение TRUE
и за-
писывает два новых дескриптора в переменные, заданные параметрами типа PHANDLE.
После этого процесс, создавший канал, обычно передает один из дескрипторов другому
процессу. Какой из дескрипторов вы будете передавать, зависит от того, что должен де-
лать процесс посредством данного канала - посылать (записывать) или получать (читать)
информацию. Вы можете передать дескриптор дочернему процессу с помощью его ко-
мандной строки или воспользовавшись стандартными дескрипторами ввода/вывода. Не-
176
передавать сообщения только в одном направлении: или от клиента к серверу, или от сервера к клиенту (но не в обоих направлениях одновременно). Кроме того, анонимные каналы не работают в сетях. Клиент и сервер должны находиться на одном компьютере. Именованные каналы, которые поддерживаются в Windows NT, выполняют неко- торые задачи, недоступные для анонимных каналов. Так, они передают информацию в обоих направлениях, соединяют посредством сети процессы, происходящие на различ- ных удаленных компьютерах. Кроме того, именованные каналы могут существовать в нескольких экземплярах и имеют дополнительные режимы работы. Способность суще- ствовать в нескольких экземплярах позволяет именованным каналам соединять один сервер с несколькими клиентами. Каждый экземпляр канала представляет собой отдель- ную независимую линию связи. Сообщения одного экземпляра канала не смешиваются с сообщениями другого экземпляра. Несколько экземпляров канала создаются в том слу- чае, когда один или несколько серверов передают одно и то же идентифицирующее имя в качестве аргумента функции CreateNamedPipe(). 8.2.2. API-функции для работы с каналами Как уже было сказано выше, основное предназначение каналов - поддержка связи между процессами. Канал представляет собой буфер в памяти, где система сохраняет данные в период между записью их одним процессом и чтением другим. API-команды позволяют трактовать буфер как канал, или трубу, по которой информация "перетекает" из одного места в другое. Канал имеет два конца. Односторонний канал позволяет запи- сывать данные только на одном своем конце и читать их на другом конце, т.е. вся ин- формация "перетекает" от одного процесса к другому. Двухсторонние каналы дают воз- можность обоим процессам выполнять как запись, так и чтение информации, поэтому информация может "перетекать" одновременно в двух направлениях. Кроме того, при создании канала необходимо принять решение о том, будет он анонимным или имено- ванным [12]. Создание анонимных каналов. Анонимный канал передает информацию только в одном направлении, причем оба конца канала должны находиться на одном и том же ло- кальном компьютере. Процесс, создающий анонимный канал, получает два дескриптора: для записи и для чтения. Чтобы связаться с каким-либо процессом, сервер должен пере- дать ему один из дескрипторов. BOOL CreatePipe( PHANDLE phRead, // переменная для дескриптора чтения // (входной канал) PHANDLE phWrite, // переменная для дескриптора записи // (выходной канал) LPSECURITY_ATTRIBUTES lpsa, // привилегии доступа DWORD dwPipeSize ); // размер буфера канала (0 по умолчанию) От размера буфера канала зависит, какой максимальный объем информации может находиться в канале. Передача сообщений по заполненному каналу невозможна до тех Пор, пока на другом конце канала не будет прочитана старая информация. При успешном завершении функция CreatePipe() возвращает значение TRUE и за- писывает два новых дескриптора в переменные, заданные параметрами типа PHANDLE. После этого процесс, создавший канал, обычно передает один из дескрипторов другому процессу. Какой из дескрипторов вы будете передавать, зависит от того, что должен де- лать процесс посредством данного канала - посылать (записывать) или получать (читать) информацию. Вы можете передать дескриптор дочернему процессу с помощью его ко- мандной строки или воспользовавшись стандартными дескрипторами ввода/вывода. Не- 176
Страницы
- « первая
- ‹ предыдущая
- …
- 172
- 173
- 174
- 175
- 176
- …
- следующая ›
- последняя »