Каналы. Многопоточный сервер именованных каналов. Ожидаемые таймеры

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

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

Практическое занятие. Каналы.

При выполнении заданий можете использовать любой из двух вариантов «обмениваемых» данных:

1)  текстовые сообщения

2)  «картинки» – например, цветные шарики (одно приложение формирует и посылает другому, которое полученные данные отображает)

1. Анонимный канал

Требуется организовать обмен данными (чтение/запись) между двумя процессами посредством неименованных каналов.

  1. Создать серверный процесс (он может быть простым консольным приложением). От серверного процесса требуется:
    1. создание неименованных каналов (CreatePipe() ). В зависимости от способа передачи дескрипторов каналов клиенту такой объект должен/может быть наследуемым
    2. запуск двух экземпляров клиента и соединение их неименованным каналом (каналами).
    3. Так как от сервера больше ничего не требуется, то его можно просто завершить (не забыв закрыть все открытые дескрипторы)

2. Клиентский процесс:

·  Должен обеспечить возможность читать/писать или рисовать/рисовать

·   

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

2.1. Обмен данными посредством именованного канала

Синхронизация соединения:

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

1)  серверу часто необходимо знать, когда клиент подключился к каналу (CreateFile, вызванная клиентом об этом серверу не сообщает!!!), а писать данные в неподключенный к клиенту канал особого смысла не имеет.

2)  если все реализации канала сервера «заняты», CreateFile, вызванная клиентом, немедленно возвращается со значением INVALID_HANDLE_VALUE, а соединение, естественно не устанавливается. В такой ситуации возможно клиент предпочел бы просто подождать, пока одна из реализаций данного канала будет освобождена другим клиентом.

Поэтому оба (и сервер, и клиент) должны уметь «зависнуть» в ожидании возникновения условий, которые позволят соединению осуществиться. Именно для этих целей сервер вызывает ConnectNamedPipe, а клиент WaitNamedPipe.

Замечание: такая синхронизация работает только для именованных каналов, а для анонимных неактуальна, так как клиент анонимного канала всегда каким-нибудь образом получает дескриптор своего конца уже существующего (созданного сервером) канала.

Извещение об установлении соединения:

Также как функции ReadFile и WriteFile сервис ConnectNamedPipe может выполняться синхронно или асинхронно. Параметр lpOverlapped содержит дескриптор события и объект-событие сигнализирует, когда клиент подключается.

То, каким образом ведет себя ConnectNamedPipe, зависит от того, как был создан (или модифицирован) канал – с флагом FILE_FLAG_OVERLAPPING и режима PIPE_WAIT. Интуитивно понятно – как работает канал с ожиданием.

Ожидание клиента:

Функция ожидания клиента WaitNamedPipe на самом деле соединения не создает. Она возвращает TRUE, когда канал доступен или становится доступен (в зависимости от режима ожидания), но она не возвращает дескриптор доступного канала.

2.2. Многопоточный сервер именованных каналов. Ожидаемые таймеры

Задание:

1)  сервер организует обслуживание клиентов в отдельном потоке: а) отображает полученные от клиента данные б) посылает клиенту подтверждение (эхо)

2)  клиент формирует а) период, с которым он будет генерировать запросы к серверу, б) строчку (или любые другие, индивидуальные для данного клиента данные), которую клиент будет посылать серверу в) посредством периодического ожидаемого таймера клиент начинает генерировать заявки серверу

3)   

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

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