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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

/* Отдельный поток для опроса флага завершения ShutFlag. */

hAcceptTh = (HANDLE)_beginthreadex(NULL, 0, AcceptTh, &srv_arg[ith], 0, &ThId);

while (!ShutFlag) {

tstatus = WaitForSingleObject(hAcceptTh, CS_TIMEOUT);

if (tstatus == WAIT_OBJECT_0) break; /* Соединение установлено. */

}

CloseHandle(hAcceptTh);

hAcceptTh = NULL; /* Подготовиться к следующему соединению. */

}

_tprintf(_T("Остановка сервера. Ожидание завершения всех потоков сервера\n"));

/* Завершить принимающий поток, если он все еще выполняется. */

/* Более подробная информация об используемой логике завершения */

/* работы приведена на Web-сайте книги. */

if (hDll != NULL) FreeLibrary(hDll);

if (hAcceptTh != NULL) TerminateThread(hAcceptTh, 0);

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

for (ith = 0; ith < MAXCLIENTS; ith++) if (srv_arg [ith].status != 0) {

WaitForSingleObject(srv_arg[ith].srv_thd, INFINITE);

CloseHandle(srv_arg[ith].srv_thd);

}

shutdown(SrvSock, 2);

closesocket(SrvSock);

WSACleanup();

return 0;

}

static DWORD WINAPI AcceptTh(SERVER_ARG * pThArg) {

/* Принимающий поток, который предоставляет основному потоку возможность опроса флага завершения. Кроме того, этот поток создает серверный поток. */

LONG AddrLen, ThId;

AddrLen = sizeof(ConnectSAddr);

pThArg->sock = accept(SrvSock, /* Это блокирующий вызов. */

(struct sockaddr *)&ConnectSAddr, &AddrLen);

/* Новое соединение. Создать серверный поток. */

pThArg->status = 2;

pThArg->srv_thd = (HANDLE)_beginthreadex (NULL, 0, Server, pThArg, 0, &ThId);

return 0; /* Серверный поток продолжает выполняться. */

}

static DWORD WINAPI Server(SERVER_ARG * pThArg)

/* Функция серверного потока. Поток создается по требованию. */

{

/* Каждый поток поддерживает в стеке собственные структуры данных запроса, ответа и регистрационных записей. */

/* … Стандартные объявления из serverNP опущены … */

SOCKET ConnectSock;

int Disconnect = 0, i;

int (*dl_addr)(char *, char *);

char *ws = " \0\t\n"; /* Пробелы. */

GetStartupInfo(&StartInfoCh);

ConnectSock = pThArg->sock;

/* Создать имя временного файла. */

sprintf(TempFile, "%s%d%s", "ServerTemp", pThArg->number, ".tmp");

while (!Done && !ShutFlag) { /* Основной командный цикл. */

Disconnect = ReceiveRequestMessage(&Request, ConnectSock);

Done = Disconnect || (strcmp(Request.Record, "$Quit") == 0) || (strcmp(Request.Record, "$ShutDownServer") == 0);

if (Done) continue;

/* Остановить этот поток по получении команды "$Quit" или "$ShutDownServer". */

hTrapFile = CreateFile(TempFile, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &TempSA, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

/* Проверка наличия этой команды в DLL. Для упрощения команды */

/* разделяемой библиотеки имеют более высокий приоритет по сравнению */

/* с командами процесса. Прежде всего, необходимо извлечь имя команды.*/

i = strcspn(Request.Record, ws); /* Размер лексемы. */

memcpy(sys_command, Request.Record, i) ;

sys_command[i] = '\0';

dl_addr = NULL; /* Будет установлен в случае успешного выполнения функции GetProcAddress. */

if (pThArg->dlhandle != NULL) {/* Проверка поддержки "внутрипроцессного" сервера. */

dl_addr = (int (*)(char *, char *))GetProcAddress(pThArg->dlhandle, sys_command);

if (dl_addr != NULL) __try {

/* Защитить серверный процесс от исключений, возникающих в DLL*/

(*dl_addr)(Request.Record, TempFile);

} __except (EXCEPTION_EXECUTE_HANDLER) {

ReportError(_T("Исключение в DLL"), 0, FALSE);

}

}

if (dl_addr == NULL) { /* Поддержка внутрипроцессного сервера отсутствует. */

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

/* … То же, что в serverNP … */

}

/* … То же, что в serverNP … */

} /* Конец основного командного цикла. Получить следующую команду. */

/* Конец командного цикла. Освободить ресурсы; выйти из потока. */

_tprintf(_T("Завершение работы сервера# %d\n"), pThArg->number);

shutdown(ConnectSock, 2);

closesocket(ConnectSock);

pThArg->status = 1;

if (strcmp(Request.Record, "$ShutDownServer") == 0) {

pThArg->status = 3;

ShutFlag = TRUE;

}

return pThArg->status;

}

Замечания по поводу безопасности

В том виде, как она здесь представлена, данная клиент-серверная система не является безопасной. Если на вашей системе выполняется сервер и кому-то известен номер порта, через который вы работаете, и имя компьютера, то он может атаковать вашу систему. Другой пользователь, запустив клиентскую программу на своем компьютере, сможет выполнить на вашей системе команды, позволяющие, например, удалить или изменить файлы.

Полное обсуждение методов построения безопасных систем выходит за рамки данной книги. Тем не менее, в главе 15 показано, как обезопасить объекты Windows, а в упражнении 12.14 предлагается воспользоваться протоколом SSL.

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

Интервал:

Закладка:

Сделать

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

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


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

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

x