Харт Джонсон М.
Шрифт:
Рис. 11.3. Использование клиентами почтового ящика для обнаружения сервера
lpName — указатель на строку с именем почтового ящика, которое должно иметь следующий вид:
Имя должно быть уникальным. Точка (.) указывает на то, что почтовый ящик создается на локальном компьютере.
cbMaxMsg — максимальный размер сообщения (в байтах), которые может записывать клиент. Значению 0 соответствует отсутствие ограничений.
dwReadTimeOut — длительность интервала ожидания (в миллисекундах) для операции чтения. Значению 0 соответствует немедленный возврат, а значению MAILSLOT_WAIT_FOREVER — неопределенный период ожидания (который может длиться сколь угодно долго).
Во время открытия почтового ящика с помощью функции CreateFile клиент (записывающая программа) может указывать его имя в следующем виде:
• \\ .\mailslot\ [путь]имя — определяет локальный почтовый ящик. Примечание. В Windows 95 длина имени ограничена 11 символами.
• \\имя_компьютера\mailslot\[путь]имя — определяет почтовый ящик, расположенный на компьютере с заданным именем.
• \\имя_домена\mailslot\[путь]имя — определяет все почтовые ящики с данным именем, расположенные на компьютерах, принадлежащих данному домену. В этом случае максимальный размер сообщения составляет 424 байта.
• \\*\mailslot\[путь]имя — определяет все почтовые ящики с данным именем, расположенные на компьютерах, принадлежащих главному домену системы. В этом случае максимальный размер сообщения составляет 424 байта.
Наконец, клиент должен указывать флаг FILE_SHARE_READ. Функции GetMailslotInfo и SetMailslotInfо похожи на свои аналоги, работающие с именованными каналами.
Средства, сопоставимые с почтовыми ящиками, в UNIX отсутствуют. Однако для этой цели могут быть использованы широковещательные (broadcast) или групповые (multicast) дейтаграммы протокола TCP/IP.
Создание, подключение и именование каналов и почтовых ящиков
В табл. 11.1 сведены все допустимые формы имен каналов, которые могут использоваться клиентами и серверами приложения. Здесь же перечислены все функции, которые следует использовать для создания именованных каналов и соединения с ними.
Аналогичная информация для почтовых ящиков приведена в табл. 11.2. Вспомните, что почтовый клиент (или сервер) не обязательно должен выполняться тем же процессом или даже на той же системе, что и клиент (или сервер) приложения.
Таблица 11.1. Именованные каналы: создание, подключение и именование
Клиент приложения | Сервер приложения | |
---|---|---|
Дескриптор именованного канала или соединение | CreateFile CallNamedPipe TransactNamedPipe | CreateNamedPipe |
Имя канала | \\.\имя канала (канал является локальным) \\имя системы\имя канала (канал является локальным или удаленным) | \\.\имя канала (канал создается локальным) |
Таблица 11.2. Почтовые ящики: создание, подключение и именование
Почтовый клиент | Почтовый сервер | |
---|---|---|
Дескриптор почтового ящика | CreateFile | CreateMailslot |
Имя почтового ящика | \\.\имя почтового ящика (почтовый ящик является локальным) \\имя системы\имя почтового ящика (почтовый ящик располагается на указанной удаленной системе) \\*\имя почтового ящика (все почтовые ящики, имеющие одно и то же указанное имя) | \\.\имя почтового ящика (почтовый ящик создается локальным) |
Пример: сервер, обнаруживаемый клиентами
Программа 11.4 представляет функцию потока, которую сервер командной строки (программа 11.3), выступающий в роли почтового клиента, использует для широковещательной рассылки имени своего канала ожидающим клиентам. Возможно существование нескольких серверов с различными характеристиками и именами каналов, и клиенты получают их имена, используя почтовый ящик с известным именем. Эта функция запускается как поток программой 11.3.