Читаем Системное программирование в среде Windows полностью

Примечание

На практике многие клиент-серверные системы инвертируют используемую здесь логику поиска. Суть альтернативного варианта заключается в том, что клиент приложения действует и как почтовый клиент, осуществляя широковещательную рассылку сообщений, требующих, чтобы сервер ответил с использованием указанного именованного канала (имя канала определяется клиентом и включается в сообщение). Затем сервер приложения, действующий в качестве почтового сервера, считывает запрос и создает соединение с использованием указанного именованного канала.

Программа 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;

}

<p>Комментарии по поводу многопоточных моделей</p>

Для описания методов проектирования многопоточных программ используются такие термины, как пул потоков (thread pool), симметричные потоки (symmetric threads) и асимметричная потоковая организация программ (asymmetric threading), а мы при создании примеров использовали модель "хозяин/рабочий", именованные каналы и другие классические модели организации многопоточного выполнения программ.

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT