Именованные каналы (Named Pipe)
[COLOR="Red"]Помогите доделать эту лабораторную работу на С++![/COLOR]
Задание:
Создать приложение, демонстрирующее обмен данными через именованные каналы — как локально, так и по сети. При этом выполнять асинхронную пересылку данных с применением перекрывающихся операций записи.
Программа создает именованный канал, в который любой подключившийся канал может записать данные. В программе имеется таймер, который периодически увеличивает счетчик и выводит его обновленное значение. Счетчик является признаком того, что главная нить приложения продолжает работать.
На форме приложения 1 (сервер) находятся три кнопки, соответствующие разным режимам пересылки данных, и надпись для вывода информации о текущем состоянии.
Схема формы серврной и клиентской части приложения:
[ATTACH]3531[/ATTACH] 15.2 кб
При нажатии каждой кнопки приложение пересылает блок из 200 байтов, который читается клиентским приложением по одному байту (чтобы замедлить процесс и таким образом подчеркнуть разницу между разными типами пересылки данных).
При установке флажка «соединение» клиент в течение 10 секунд ждет, пока сервер создаст канал. Узнав о том, что канал доступен, клиент открывает канал. Если открытие удачно, клиент включает таймер для чтения данных из канала и читает данные.
В каждом событии таймера из канала читается всего один байт. Конечно, данные читаются из канала чрезвычайно медленно, но это сделано для наглядной демонстрации отличий между синхронным и асинхронным режимом пересылки, а не для эффективного обмена данными между процессами.
Программа должна уметь поочередно обслуживать несколько клиентов.
Программа должна уметь одновременно передавать данные нескольким клиентам (вам придется создать несколько экземпляров канала).
[ATTACH]3525[/ATTACH] (45.1 кб)
Тут находится проект на С++Builder6 серверного и клиентского приложения (нет только асинхронной передачи данных без использования таймера).
[COLOR="Red"]Проблема такая: почему то клиент не хочет соединяться с сервером.[/COLOR]
Помогите найти ошибки в данном проекте или киньте свой код на С++ удовлетворяющему заданию лабораторной работы.
[COLOR="#ff0000"]Заранее благодарю тех, кто поможет![/COLOR]
Именованные каналы (Named Pipes) - это объекты ядра, являющиеся средством межпроцессной коммуникации между сервером канала и одним или несколькими клиентами канала.
Сервером канала называется процесс, создающий именованный канал.
Клиентом канала называется процесс, подключающийся к созданному именованному каналу.
От других аналогичных объектов именованные каналы отличает гарантированная доставка сообщений, возможность асинхронного ввода/вывода, возможность коммуникации между процессами на разных компьютерах в локальной вычислительной сети и относительная простота использования.
По своему назначению они похожи на каналы операционной системы UNIX.
При создании именованного канала ему назначается уникальное имя, определяется максимальное количество одновременных соединений с клиентами канала и режим работы канала (должен ли канал быть односторонним или двусторонним (дуплексным), ведется ли передача пакетами или потоком байтов. При передаче пакетами данные одной операции записи отделяются в буфере канала от данных другой операции записи).
Базовым объектом для реализации именованных каналов служит объект "файл", поэтому для посылки и приема сообщений по именованным каналам используются те же самые функции Windows API, что и при работы с файлами (ReadFile, WriteFile).
Для каждого процесса-клиента канала создается свой экземпляр канала, с собственными буферами и дескрипторами (handles) и с собственным механизмом передачи данных, не влияющим на остальные экземпляры.
Экземпляры одного канала имеют общее имя, указанное при создании, сервер назначает имя канала в соответствии с универсальными правилами именования (Universal Naming Convention, UNC), которые обеспечивают независимый от протоколов способ идентификации каналов в Windows-сетях.
Именованные каналы, также как и файлы, наследуют стандартную защиту объектов Windows, что позволяет разграничить участников коммуникации и обеспечить запрет несанкционированного доступа к каналу.
Создание именованных каналов возможно только в NT-системах, подключение к созданному каналу возможно как в NT-системах, так и в Win9x. Кроме того, API работы с каналами в Win9x не поддерживает асинхронных операций ввода/вывода.
Именованные каналы широко используются внутри самой системы. Например, взаимодействие менеджера сервисов с самими сервисами осуществляется через несколько именованных каналов. Для связи с сервисами RunAs, с планировщиком событий и с сервером локальной аутентификации также используются именованные каналы.
Именованные каналы являются наиболее простым способом организации связи между сервисами и пользовательскими приложениями, нуждающимися в такой связи.
Одним из полезных (и довольно уникальных) свойств именованного канала является возможность сервера заменять права своей учетной записи правами учетной записи клиента, соединившегося с каналом. Эта возможность служит преимущественно для ограничения прав сервера при выполнении операций доступа к различным объектам системы.
Для работы с именованными каналами Windows API предоставляет следующие функции:
CreateNamedPipe Создание именованного канала или нового экземпляра канала. Функция доступна только серверу.
ConnectNamedPipe или CreateFile Подключение к экземпляру именованного канала со стороны клиента. Функция доступна только клиенту.
WaitNamedPipe Ожидание клиентом появления свободного экземпляра именованного канала для подключения к нему.
ConnectNamedPipe Ожидание сервером подключения клиента к экземпляру именованного канала.
ReadFile, ReadFileEx Чтение данных из именованного канала. Функция доступна как клиенту, так и серверу.
WriteFile, WriteFileEx Запись данных в именованный канал. Функция доступна как клиенту, так и серверу.
PeekNamedPipe Чтение данных из именованного канала без удаления прочитанных данных из буфера канала. Функция доступна как клиенту, так и серверу.
TransactNamedPipe Запись и чтение из именованного канала одной операцией. Функция доступна как клиенту, так и серверу.
DisconnectNamedPipe Отсоединение сервера от экземпляра именованного канала.
GetNamedPipeInfo Получение информации об именованном канале.
GetNamedPipeHandleState Получение текущего режима работы именованного канала и количества созданных экземпляров канала.
SetNamedPipeHandleState Установка текущего режима работы именованного канала.
CloseHandle Закрытие дескриптора экземпляра именованного канала, освобождение связанных с объектом ресурсов.
FlushFileBuffers Сброс данных из кэша в буфер канала.