Джонсон Харт - Системное программирование в среде Windows

Здесь есть возможность читать онлайн «Джонсон Харт - Системное программирование в среде Windows» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва • Санкт-Петербург • Киев, Год выпуска: 2005, ISBN: 2005, Издательство: Издательский дом Вильямс, Жанр: ОС и Сети, Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Системное программирование в среде Windows: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Системное программирование в среде Windows»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Эта книга посвящена вопросам разработки приложений с использованием интерфейса прикладного программирования операционных систем компании Microsoft (Windows 9х, Windows XP, Windows 2000 и Windows Server 2003). Основное внимание уделяется базовым системным службам, включая управление файловой системой, процессами и потоками, взаимодействие между процессами, сетевое программирование и синхронизацию. Рассматривается методика переноса приложений, написанных в среде Win32, в среду Win64. Подробно описываются все аспекты системы безопасности Windows и ее практического применения. Изобилие реальных примеров, доступных также и на Web-сайте книги, существенно упрощает усвоение материала.
Книга ориентирована на разработчиков и программистов, как высокой квалификации, так и начинающих, а также будет полезна для студентов соответствующих специальностей.

Системное программирование в среде Windows — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Системное программирование в среде Windows», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Хотя соответствующий код и не включен в программу 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;

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) { /* Цикл соединений. */

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

hConTh = (HANDLE)_beginthreadex(NULL, 0, Connect, pThArg, 0, &ConThId);

/* Ожидание соединения с клиентом и проверка флага завершения работы.*/

while (!ShutDown && WaitForSingleObject(hConTh, CS_TIMEOUT) == WAIT_TIMEOUT) { /* Пустое тело цикла. */ };

CloseHandle(hConTh);

if (ShutDown) continue; /*Флаг может быть установлен любым потоком.*/

/* Соединение существует. */

while (!ShutDown && ReadFile(hNamedPipe, &Request, RQ_SIZE, &nXfer, NULL)) {

/* Получать новые команды до отсоединения клиента. */

ShutDown = ShutDown || (_tcscmp(Request.Record, ShutRqst) == 0);

if (ShutDown) continue; /* Проверяется на каждой итерации. */

/* Создать процесс для выполнения команды. */

StartInfoCh.hStdOutput = hTmpFile;

StartInfoCh.hStdError = hTmpFile;

StartInfoCh.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

StartInfoCh.dwFlags = STARTF_USESTDHANDLES;

CreateProcess(NULL, Request.Record, NULL, NULL, TRUE, /* Унаследовать дескрипторы. */

0, NULL, NULL, &StartInfoCh, &ProcInfo);

/* Выполняется процесс сервера. */

CloseHandle(ProcInfo.hThread);

WaitForSingleObject(ProcInfo.hProcess, INFINITE);

CloseHandle(ProcInfo.hProcess);

/* Отвечать по одной строке за один раз. Здесь удобно использовать функции библиотеки С для работы со строками. */

fp = _tfopen(pThArg->TmpFileName, _T("r"));

Response.Status = 0;

while(_fgetts(Response.Record, MAX_RQRS_LEN, fp) != NULL) WriteFile(hNamedPipe, &Response, RS_SIZE, &nXfer, NULL);

FlushFileBuffers(hNamedPipe);

fclose(fp);

/* Уничтожить содержимое временного файла. */

SetFilePointer(hTmpFile, 0, NULL, FILE_BEGIN);

SetEndOfFile(hTmpFile);

/* Отправить признак конца ответа. */

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Системное программирование в среде Windows»

Представляем Вашему вниманию похожие книги на «Системное программирование в среде Windows» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Системное программирование в среде Windows»

Обсуждение, отзывы о книге «Системное программирование в среде Windows» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x