Использование почтовых ящиков для связи между процессами

ОГЛАВЛЕНИЕ

Данная статья повествует о том, как использовать почтовые ящики для связи между процессами.

•    Скачать проект перечислителя почтовых ящиков - 24 Кб
•    Скачать проект слушателя почтового ящика - 22 Кб
•    Скачать проект писателя почтового ящика - 22 Кб
•    Скачать исходники библиотеки почтового ящика - 20 Кб

Введение

Иногда надо, чтобы одна программа взаимодействовала с другой. У вас может быть много серверов, работающих на множестве машин, и вам надо дистанционно управлять одним или более серверами из центрального места. Windows предоставляет много методов связи –  от сокетов посредством именованных каналов до DDE(динамический обмен данными), DCOM(распределённая компонентная модель объектов) и почтовых ящиков. В этот раз рассматриваются почтовые ящики. Предполагается небольшое знание API (интерфейсов программирования приложений) CreateFile(), ReadFile() и WriteFile() и основ совмещенного ввода-вывода.

Почтовые ящики

Реализует протокол 'много писателей/один читатель'. Процесс создает почтовый ящик по имени и затем ждет, когда в него запишутся сообщения. Другие процессы могут открыть почтовый ящик, если они знают его имя, и писать сообщения в него. Можно иметь лишь одного читателя почтового ящика, но можно иметь много писателей почтового ящика. Microsoft использует терминологию сервер/клиент для описания этого. По терминологии Microsoft, сервер создает и читает из почтового ящика; клиент подключается к имеющемуся почтовому ящику и пишет в него. Это слегка сбивает с толку – удобней мыслить в терминах читателей почтового ящика и писателей почтового ящика.

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

Почтовые ящики работают через сеть. Вы задаете имя почтового ящика в формате UNC(общее соглашение об именовании), так же, как вы бы задали имя файла на сервере где-то в вашей сети. Если бы вы имели два процесса, работающие на одном и том же компьютере, и использовали бы почтовые ящики для связи между ними, вы бы создали почтовый ящик путем задания имени \\.\mailslot\slotname, и процесс, подключаясь к этому почтовому ящику, использовал бы это же имя. Видите точку в имени? Это псевдоним для компьютера, на котором работает процесс, в данном случае, означает «искать почтовый ящик на локальном компьютере». Чтобы поставить сеть приложения в известность, вы бы заменили точку на имя компьютера, на котором работает процесс, создавший почтовый ящик. Итак, если бы у нас было два компьютера, названные, соответственно, Rob и Chris, и процесс, работающий на компьютере под именем Chris, создал бы почтовый ящик под именем cp, процесс, работающий на компьютере под именем Rob, смог бы подключиться к этому почтовому ящику, используя имя \\chris\mailslot\cp.