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

 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;

  GetTempFileName(_T("."), _T("CLP"), 0, ThArgs[iNp].TmpFileName);

  hSrvrThread[iNp] = (HANDLE)_beginthreadex(NULL, 0, Server, &ThArgs[iNp], 0, &ThreadId);

 }

 /* Ждать завершения выполнения всех потоков. */

 WaitForMultipleObjects(MAXCLIENTS, hSrvrThread, TRUE, INFINITE);

 WaitForSingleObject(hMonitor, INFINITE);

 CloseHandle(hMonitor);

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

  /* Закрыть дескрипторы канала и удалить временные файлы. */

  CloseHandle(hSrvrThread[iNp]);

  DeleteFile(ThArgs[iNp].TmpFileName);

 }

 _tprintf(_T("Серверный процесс завершил выполнение.\n"));

 return 0;

}

static DWORD WINAPI Server(LPTHREAD_ARG pThArg)

/* Функция потока сервера; по одной для каждого потенциального клиента. */

{

 HANDLE hNamedPipe, hTmpFile = INVALID_HANDLE_VALUE, hConTh, hClient;

 DWORD nXfer, ConThId, ConThStatus;

 STARTUPINFO StartInfoCh;

 SECURITY_ATTRIBUTES TempSA = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

 PROCESS_INFORMATION ProcInfo;

 FILE *fp;

 REQUEST Request;

 RESPONSE Response;

 GetStartupInfo(&StartInfoCh);

 hNamedPipe = pThArg->hNamedPipe;

 hTmpFile = CreateFile(pThArg->TmpFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &TempSA, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NULL);

 while (!ShutDown) { /* Цикл соединений. */

  /* Создать поток соединения; ждать его завершения. */

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

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

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

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

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

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

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

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

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

Все жанры