15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Обмен данными через канал обмена


Автор: Ion Tichy. (http://www.iont.20m.com)

Требования: VC6, WindowsNT4, Windows2000

Client

Server

1. Описание

Простой и быстрый способ связи между всеми типами приложений MFC на одном или нескольких компьютерах в Windows NT.

2. Основные возможности

Передача данных от Клиента к Серверу, обработка их и, при необходимости, возврат результатов.
Передача информационных данных о возможных событиях от Сервера к Клиенту.
Различные схемы распределения буфера.
Автоматическая загрузка Сервера.
При необходимости, автоматическое завершение Сервера без участия Клиента.
Утилиты для регистрации, автоматической загрузки, трейсинга (tracing) и Визарда (Wizard).

3. Введение

Несколько лет назад я написал классы, с использованием почтовых слотов (Mailslots) для связи между Клиентом и Сервером. Согласно требованиям проекта, эти классы должны были работать в Windows 95. Несмотря на многочисленные проблемы и ограничения почтовых слотов, эти классы корректно работают в Windows 95 и Windows NT.

Вышеупомянутые проблемы заключаются в следующем:

  • 8-байтовое ограничение имён почтовых слотов в Windows 95 и
  • большой трафик между компьютерами через почтовые слоты, если на них установлены различные идентичные протоколы передачи данных.

Microsoft объясняет это особенностями архитектуры. Другими словами, это не ошибка, но я не согласен с такой расстановкой вещей.

В данных классах Сервер имеет поток, отвечающий за приём, а Клиенты посылают данные со своими (Клиентскими) идентификаторами (Имя компьютера и имя клиента) в этот поток. В итоге это увеличивает суммарный объём передачи данных, которые передаёт Клиент через почтовые слоты. Это и есть недостаток данного метода.

После изучения технологий COM и ATL я пришёл к выводу, что ATL очень удобный инструмент, однако, и в ней есть некоторые ограничения, такие как невозможность создания ATL-Сервера из существующего приложения MFC.

Внедрения DCOM в приложение также требует больших усилий. Например, я трудился над своей первой программой с DCOM как минимум 2 недели и вынужден был долго искать ответы на свои вопросы у Microsoft. Именно поэтому, несмотря на моё желание использовать COM/DCOM в новом проекте, пришлось отказаться от этой идеи.

Новый проект, над которым я начал работать, требовал высокой скорости обработки данных. Данный фактор нужно было обязательно учесть при разработке нового механизма связи. К счастью, в отличие от COM, небыло никаких требований к универсальности механизма. Это значительно упростило разработку приложения.

Итак, я остановился на Именованных каналах (Named Pipes) работающих только в Windows NT. В литературе данный протокол описывается следующим образом:

Механизм взаимодействия процессов, который позволяет одному процессу связываться с другим (локальным или удалённым) процессом.

Так же я попытался использовать идею почтовых слотов (Mailslots) из моего первого проекта, а так же механизм COM. Далее мы рассмотрим архитектуру Клиент-Сервер, основанную на протоколе Именованных каналов (Named Pipes).

 

4. Архитектура Клиент-Сервер

Итак, существуют следующие варианты связи Клиента и Сервера.

  • Клиент и Сервер на одном компьютере.
  • Клиент и Сервер на разных компьютерах.



Кликните сюда для увеличения картинки

Итак, когда Сервер загружен, то Клиент пытается установить соединение с Сервером.

Если Сервер не загружен и, Клиент и Сервер находятся на одном компьютере, то Клиент может получить информацию о Сервере из реестра этого компьютера (см. Computer 4).

Если Сервер не загружен и, Клиент и Сервер на разных компьютерах, то Клиент может получить информацию о Сервере из реестра другого компьютера, на котором находится Сервер посредствам утилиты AgentCP (см. Computers 1 и 2). Данная програмка ищет информацию о Сервере в реестре серверного компьютера и загружает его.

Как видно из рисунка, для успешного функционирования вышеупомянутого процесса необходимо:

  • Записать информацию о сервере в реестр серверного компьютера.
  • Предварительно запустить на удалённом компьютере утилиту AgentCP.

Таким образом, выполняется автоматическая загрузка Сервера. Процесс-Сервер может быть автоматически завершён, если Клиент не приконнектился.

А вот так выглядит приложение WizardCP:



Кликните сюда для увеличения картинки

Downloads

Скачать юзер мануал - 169 KB
Скачать демонстрационный проект - 200 KB
Скачать WizardCP - 40 KB
Скачать Test, сгенерированный посредствам WizardCP - 119 KB