При выполнении заданий можете использовать любой из двух вариантов «обмениваемых» данных:
1) текстовые сообщения
2) «картинки» – например, цветные шарики (одно приложение формирует и посылает другому, которое полученные данные отображает)
Требуется организовать обмен данными (чтение/запись) между двумя процессами посредством неименованных каналов.
2. Клиентский процесс:
· Должен обеспечить возможность читать/писать или рисовать/рисовать
·
Синхронизация соединения:
Проблема: клиент может в любой момент вызвать CreateFile для того, чтобы «открыть» свой конец именованного канала. При этом могут возникнуть следующие проблемы:
1) серверу часто необходимо знать, когда клиент подключился к каналу (CreateFile, вызванная клиентом об этом серверу не сообщает!!!), а писать данные в неподключенный к клиенту канал особого смысла не имеет.
2) если все реализации канала сервера «заняты», CreateFile, вызванная клиентом, немедленно возвращается со значением INVALID_HANDLE_VALUE, а соединение, естественно не устанавливается. В такой ситуации возможно клиент предпочел бы просто подождать, пока одна из реализаций данного канала будет освобождена другим клиентом.
Поэтому оба (и сервер, и клиент) должны уметь «зависнуть» в ожидании возникновения условий, которые позволят соединению осуществиться. Именно для этих целей сервер вызывает ConnectNamedPipe, а клиент WaitNamedPipe.
Замечание: такая синхронизация работает только для именованных каналов, а для анонимных неактуальна, так как клиент анонимного канала всегда каким-нибудь образом получает дескриптор своего конца уже существующего (созданного сервером) канала.
Извещение об установлении соединения:
Также как функции ReadFile и WriteFile сервис ConnectNamedPipe может выполняться синхронно или асинхронно. Параметр lpOverlapped содержит дескриптор события и объект-событие сигнализирует, когда клиент подключается.
То, каким образом ведет себя ConnectNamedPipe, зависит от того, как был создан (или модифицирован) канал – с флагом FILE_FLAG_OVERLAPPING и режима PIPE_WAIT. Интуитивно понятно – как работает канал с ожиданием.
Ожидание клиента:
Функция ожидания клиента WaitNamedPipe на самом деле соединения не создает. Она возвращает TRUE, когда канал доступен или становится доступен (в зависимости от режима ожидания), но она не возвращает дескриптор доступного канала.
Задание:
1) сервер организует обслуживание клиентов в отдельном потоке: а) отображает полученные от клиента данные б) посылает клиенту подтверждение (эхо)
2) клиент формирует а) период, с которым он будет генерировать запросы к серверу, б) строчку (или любые другие, индивидуальные для данного клиента данные), которую клиент будет посылать серверу в) посредством периодического ожидаемого таймера клиент начинает генерировать заявки серверу
3)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.