Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаба12.doc
Скачиваний:
20
Добавлен:
12.11.2019
Размер:
173.06 Кб
Скачать

20

Министерство образования и науки Российской Федерации

Казанский государственный технический университет

имени А.Н. Туполева

_______________________________________________________

Межкафедральный филиал факультета № 4 в ОАО ICL-КПО ВС

Р.Ф. Миннибаев

Методическое руководство к

лабораторной работе

“Анонимные и именованные каналы”

по дисциплине “Системное программирование”

Казань 2004

Содержание

1. Каналы. Именованные и анонимные каналы. Назначение. Области применения 3

2.Использование анонимных каналов 3

3. Использование именованных каналов 3

3.1. Серверная сторона именованных каналов 3

3.2. Клиентская сторона именованных каналов 4

3.3. Решения при разработке сервера именованного канала 4

4. Порядок выполнения работы 4

5.Контрольные вопросы 5

Приложения 6

1.Пример многопоточного сервера 6

2.Пример клиента 8

3.Использование дополнительных функций 9

4.Пример сервера с асинхронным вводом – выводом 10

5.Пример сервера с процедурами завершения 15

1. Каналы. Именованные и анонимные каналы. Назначение. Области применения

Идеальный механизм межпроцессной связи для потоковой передачи - канал (pipe), т. е. выделенная "линия" передачи данных, соединяющая два процесса. То, что отправляется в канал одним процессом, может быть принято другим; поток данных может быть одно- или двунаправленным. Данные в канал заносятся с использованием функции Win32 WriteFile, а считываются с помощью функции ReadFile.

В Windows NT реализуются два типа каналов: именованные и анонимные. Именованным каналам, как и файлам, присваиваются имена. Именованный канал формируется функцией CreateNamedPipe, которая кроме этого передает в вызывающую программу дескриптор канала. После того как именованный канал сформирован, можно подключить к нему клиентский процесс, передав имя канала в функцию CreateFile. Именованные каналы можно использовать для связи между двумя процессами, функционирующими на одном ПК, либо для связи между процессом, выполняющимся на сервере сети, и процессом на рабочей станции.

2.Использование анонимных каналов

Анонимные каналы не имеют имен. Анонимный канал формируется путем вызова из программы функции CreatePipe; в вызывающую программу передаются дескриптор записи и дескриптор чтения. Если к анонимному каналу нужно подключить еще одну программу, то необходимо передать ей дескриптор канала из первой программы. Поскольку дескрипторы каналов Win32 привязаны к процессам (иными словами, как и указатели, действительны только в контексте конкретного процесса), то в одном из процессов необходимо создать копию дескриптора, которой сможет воспользоваться клиент. Это сопряжено с дополнительной работой, поэтому большинство программистов предпочитают полагаться на именованные каналы, за исключением случаев, когда клиентский процесс представляет собой дочерний процесс, в который дескриптор канала можно передать с помощью механизма наследования. Поскольку анонимные каналы непригодны для обмена данными через сеть, их можно использовать для обмена данными лишь между программами, работающими на одном ПК.

3. Использование именованных каналов

3.1. Серверная сторона именованных каналов

При использовании именованных каналов

Со стороны сервера необходимо:

  1. Создать именованный канал, функция - CreateNamedPipe

  2. Вызвать функцию ConnectNamedPipe, которая ожидает соединения со стороны клиента

  3. Далее при соединении с клиентом необходимо прочитать из данного канала запрос клиента, функция - ReadFile. (первым параметром – дескриптор канала).

  4. После чтения запроса можно поместить ответ в канал, функция - WriteFile. (первым параметром – дескриптор канала)

  5. После обработки запроса вызвать функции FlushFileBuffers, DisconnectNamedPipe , CloseHandle – для закрытия канала;

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

3.2. Клиентская сторона именованных каналов

Со стороны клиента

  1. Вызвать функцию CreateFile, в качестве первого параметра имя канала, а второй тип доступа – запись/ чтение

  2. Ожидать освобождения сервера WaitNamedPipe

  3. Задать режим обмена с сервером , функция SetNamedPipeHandleState.

  4. Отправить запрос серверу, функция WriteFile. (первым параметром – дескриптор канала)

  5. Получить ответ, функция - ReadFile. (первым параметром – дескриптор канала).

  6. Закрыть канал после того, как обмен сообщениями закончен - функция CloseHandle.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]