Вход/Регистрация
Системное программирование в среде Windows
вернуться

Харт Джонсон М.

Шрифт:

 while (INVALID_HANDLE_VALUE == hNamedPipe) {

WaitNamedPipe(ServerPipeName, NMPWAIT_WAIT_FOREVER);

hNamedPipe = CreateFile(ServerPipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

 }

 /* Задать блокирование дескриптора именованного канала; режим сообщений.*/

 SetNamedPipeHandleState(hNamedPipe, &NpMode, NULL, NULL);

 /* Вывести приглашение пользователю для ввода команд. Завершить выполнение по получении команды "$quit." */

 while (ConsolePrompt(PromptMsg, Request.Record, MAX_RQRS_LEN, TRUE) && (_tcscmp(Request.Record, QuitMsg) != 0)) {

WriteFile(hNamedPipe, &Request, RQ_SIZE, &nWrite, NULL);

/* Считать каждый ответ и направить его на стандартный вывод.

Response.Status = 0 означает "конец ответного сообщения." */

while (ReadFile(hNamedPipe, &Response, RS_SIZE, &nRead, NULL) && (Response.Status == 0)) _tprintf(_T("%s"), Response.Record);

 }

 _tprintf(_T("Получена команда завершения работы. Соединение разрывается."));

 CloseHandle(hNamedPipe);

 return 0;

}

Программа 11.3 — это серверная программа, включающая функцию потока сервера, которая обрабатывает запросы, генерируемые с помощью программы 11.2. Кроме того, сервер создает "широковещательный серверный поток" ("server broadcast thread") (см. программу 11.4), который используется для широковещательной рассылки имени своего канала всем клиентам, желающим подключиться, посредством почтового ящика. В программе 11.2 вызывается функция LocateServer, представленная в программе 11.5, которая считывает информацию, отправленную данным процессом. Почтовые ящики описываются далее в настоящей главе.

Хотя соответствующий код и не включен в программу 11.4, в ней предусмотрена возможность защиты сервером (представлен на Web-сайте) своего именованного канала с целью предотвращения доступа к нему клиентов, не имеющих должных полномочий. Вопросы безопасности объектов рассматриваются в главе 15, где будет также показано, как использовать указанную возможность.

Программа 11.3. serverNP: многопоточный сервер именованного канала 

/* Глава 11. ServerNP. */

/* Многопоточный сервер командной строки. Версия на основе именованных каналов. */

#include "EvryThng.h"

#include "ClntSrvr.h" /* Определения сообщений запроса и ответа. */

typedef struct { /* Аргумент серверного потока. */

 HANDLE hNamedPipe; /* Экземпляр именованного канала. */

 DWORD ThreadNo;

 TCHAR TmpFileName[MAX_PATH]; /* Имя временного файла. */

} THREAD_ARG;

typedef THREAD_ARG *LPTHREAD_ARG;

volatile static BOOL ShutDown = FALSE;

static DWORD WINAPI Server(LPTHREAD_ARG);

static DWORD WINAPI Connect(LPTHREAD_ARG);

static DWORD WINAPI ServerBroadcast(LPLONG);

static BOOL WINAPI Handler(DWORD);

static TCHAR ShutRqst[] = _T("$ShutDownServer");

_tmain(int argc, LPTSTR argv[]) {

 /* Определение MAX_CLIENTS содержится в файле ClntSrvr.h. */

 HANDLE hNp, hMonitor, hSrvrThread[MAXCLIENTS];

 DWORD iNp, MonitorId, ThreadId;

 LPSECURITY_ATTRIBUTES pNPSA = NULL;

 THREAD_ARG ThArgs[MAXCLIENTS];

 /* Обработчик управляющих сигналов консоли, используемый для остановки сервера. */

 SetConsoleCtrlHandler(Handler, TRUE);

 /* Периодически создавать имя широковещательного канала потока. */

 hMonitor = (HANDLE)_beginthreadex(NULL, 0, ServerBroadcast, NULL, 0, &MonitorId);

 /* Создать экземпляр канала и временный файл для каждого серверного потока. */

 for (iNp = 0; iNp < MAX_CLIENTS; iNp++) {

hNp = CreateNamedPipe(SERVER_PIPE, PIPE_ACCESS_DUPLEX, PIPE_READMODE_MESSAGE | PIPE_TYPE_MESSAGE | PIPE_WAIT, MAXCLIENTS, 0, 0, INFINITE, pNPSA);

ThArgs[iNp].hNamedPipe = hNp;

ThArgs[iNp].ThreadNo = iNp;

  • Читать дальше
  • 1
  • ...
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: