Книга: Системное программирование в среде Windows
Пример: сервер, обнаруживаемый клиентами
Разделы на этой странице:
Пример: сервер, обнаруживаемый клиентами
Программа 11.4 представляет функцию потока, которую сервер командной строки (программа 11.3), выступающий в роли почтового клиента, использует для широковещательной рассылки имени своего канала ожидающим клиентам. Возможно существование нескольких серверов с различными характеристиками и именами каналов, и клиенты получают их имена, используя почтовый ящик с известным именем. Эта функция запускается как поток программой 11.3.
Примечание
На практике многие клиент-серверные системы инвертируют используемую здесь логику поиска. Суть альтернативного варианта заключается в том, что клиент приложения действует и как почтовый клиент, осуществляя широковещательную рассылку сообщений, требующих, чтобы сервер ответил с использованием указанного именованного канала (имя канала определяется клиентом и включается в сообщение). Затем сервер приложения, действующий в качестве почтового сервера, считывает запрос и создает соединение с использованием указанного именованного канала.
Программа 11.4. SrvrBcst: функция потока почтового клиента
static DWORD WINAPI ServerBroadcast(LPLONG pNull) {
MS_MESSAGE MsNotify;
DWORD nXfer;
HANDLE hMsFile;
/*Открыть почтовый ящик для записывающей программы почтового "клиента"*/
while (!ShutDown) { /* Цикл выполняется до тех пор, пока имеются серверные потоки. */
/* Ждать, пока другой клиент не откроет почтовый ящик. */
Sleep(CS_TIMEOUT);
hMsFile = CreateFile(MS_CLTNAME, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN EXISTING, FILE ATTRIBUTE NORMAL, NULL);
if (hMsFile == INVALID_HANDLE_VALUE) continue;
/* Отправить сообщение в почтовый ящик. */
MsNotify.msStatus = 0;
MsNotify.msUtilization = 0;
_tcscpy(MsNotify.msName, SERVER_PIPE);
if (WriteFile(hMsFile, &MsNotify, MSM_SIZE, &nXfer, NULL)) ReportError(_T("Ошибка записи почтового сервера."), 13, TRUE);
CloseHandle(hMsFile);
}
_tprintf(_T("Закрытие контролирующего потока.n"));
_endthreadex(0);
return 0;
}
В программе 11.5 представлена функция, которая вызывается клиентом (см. программу 11.2) для обнаружения сервера.
Программа 11.5. LocSrvr: почтовый сервер
/* Глава 11. LocSrver.c */
/* Найти сервер путем считывания информации из почтового ящика, используемого для широковещательной рассылки имен серверов. */
#include "EvryThng.h"
#include "ClntSrvr.h" /* Определяет имя почтового ящика. */
BOOL LocateServer(LPTSTR pPipeName) {
HANDLE MsFile;
MS_MESSAGE ServerMsg;
BOOL Found = FALSE;
DWORD cbRead;
MsFile = CreateMailslot(MS_SRVNAME, 0, CS_TIMEOUT, NULL);
while (!Found) {
_tprintf(_T("Поиск сервера.n"));
Found = ReadFile(MsFile, &ServerMsg, MSM_SIZE, &cbRead, NULL);
}
_tprintf(_T("Сервер найден.n"));
CloseHandle(MsFile);
/* Имя канала сервера. */
_tcscpy(pPipeName, ServerMsg.msName);
return TRUE;
}
- Анонимные каналы
- Пример: перенаправление ввода/вывода с использованием анонимного канала
- Именованные каналы
- Функции транзакций именованных каналов
- Пример: клиент-серверный процессор командной строки
- Комментарии по поводу клиент-серверного процессора командной строки
- Почтовые ящики
- Создание, подключение и именование каналов и почтовых ящиков
- Пример: сервер, обнаруживаемый клиентами
- Комментарии по поводу многопоточных моделей
- Резюме
- Упражнения
- Запуск InterBase-сервера
- Расширенная установка InterBase-сервера
- Пример установочного скрипта
- Пример из практики
- Совместимость клиентов и серверов различных версий
- Статистика InterBase-сервера
- Сервер для InterBase
- 1.3.3. Достоинства и недостатки анонимных прокси-серверов
- Минимальный состав сервера InterBase SuperServer
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Отличительные особенности сервера Yaffil
- Встраиваемый сервер