Для этого мы разработаем четыре приложения: • • • • клиентское приложение, предназначенное для работы с эхо-сервером; эхо-сервер на основе использования функций обратного вызова; эхо-сервер, основанный на модели событий. <...> Содержание файла nbcommon.h приводится ниже: #include <windows.h> #include <nb30.h> 5 библиотеку общих функций для приложений NetBIOS (используются как сервером, так и клиентом); extern "C" int Recv(int lana, int lsn, char *buffer, DWORD *len); extern "C" int Send(int lana, int lsn, char *data, DWORD len); extern "C" int AddName(int lana, char *name, int *num); extern "C" int DelName(int lana, char *name); extern "C" int AddGroupName(int lana, char *name, int *num); extern "C" int ResetAll(LANA_ENUM *lenum, UCHAR ucMaxSession, UCHAR ucMaxName, BOOL bFirstName); extern "C" int LanaEnum(LANA_ENUM *lenum); extern "C" int Hangup(int lana, int lsn); extern "C" int Cancel(PNCB pncb); extern "C" int FormatNetbiosName(char *nbname, char *outname); extern "C" char NbCommonErrorMsg[]; Строка NbCommonErrorMsg предназначена для записи сообщения с описанием последней произошедшей ошибки для того, чтобы вызывающая функция могла вывести это сообщение с учетом используемого ею пользовательского интерфейса. <...> Функция предназначена для перечисления всех номеров LANA. int LanaEnum(LANA_ENUM *lenum) { NCB ncb; NbCommonErrorMsg[0]=0; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (PUCHAR)lenum; ncb.ncb_length = sizeof(LANA_ENUM); if (Netbios(&ncb) ! <...> Функция осуществляет сбор сведений о LANA, перечисленных в структуре LANA_ENUM, а также настройку среды NetBIOS: максимальное число сеансов, максимальный размер таблицы имен, использование первого NetBIOS имени. int ResetAll(LANA_ENUM *lenum, UCHAR ucMaxSession, UCHAR ucMaxName, BOOL bFirstName) { NCB int ncb; i; NbCommonErrorMsg[0]=0; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBRESET; ncb.ncb_callname[0] = ucMaxSession; ncb.ncb_callname[2] = ucMaxName; ncb.ncb_callname[3] = (UCHAR)bFirstName; 7 <...>
Разработка_сетевых_приложений_для_ОС_Windows_(практические_примеры)_учебное_пособие.pdf
Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Ярославский государственный университет им. П. Г. Демидова
В. В. Васильчиков
Разработка
сетевых приложений
для ОС Windows
(практические примеры)
Учебное пособие
Рекомендовано
Научно-методическим советом университета
для студентов, обучающихся по специальностям
Прикладная математика и информатика
и Математическое обеспечение
и администрирование информационных систем
Ярославль 2009
Стр.1
УДК 519.2
ББК 3973.2-018я73
В 19
Рекомендовано
Редакционно-издательским советом университета
в качестве учебного издания. План 2009 года
Рецензенты:
кандидат физико-математических наук С. И. Щукин;
кафедра теории и методики обучения информатике ЯГПУ
им. К. Д. Ушинского
В 19
Васильчиков, В. В. Разработка сетевых приложений для ОС
Windows (практические примеры) : учебное пособие / В. В. Васильчиков
; Яросл. гос. ун-т им. П. Г Демидова. – Ярославль :
ЯрГУ, 2009. – 214 с.
ISBN 978-5-8397-0659-0
На практических примерах рассмотрены основные моменты
разработки сетевых Windows-приложений для платформы Win32
с использованием среды Microsoft Visual Studio и библиотеки
MFC.
Предназначено для студентов, обучающихся по специальностям
010501 Прикладная математика и информатика и 010503
Математическое обеспечение и администрирование информационных
систем (дисциплина специализации "Программирование в
сетях Windows", блок ДС, СД), очной формы обучения.
Библиогр.: 7 назв.
УДК 519.2
ББК 3973.2-018я73
ISBN 978-5-8397-0659-0
© Ярославский
государственный
университет
им. П. Г. Демидова, 2009
2
Стр.2
Введение
В 2007 году автором было издано учебное пособие [7], предназначенное
для поддержки лекционного курса по программированию в сетях
Windows, читавшегося для студентов факультета ИВТ ЯрГУ,
обучающихся по специальностям "Прикладная математика и информатика"
и "Математическое обеспечение и администрирование информационных
систем". В нем были рассмотрены существующие технологии и
Win32 API-функции, использующиеся для создания сетевых приложений
различных версий ОС Windows. В упомянутом учебном пособии, разумеется,
присутствовали практические примеры для иллюстрации
рассматриваемых средств и приемов программирования. Все примеры
программ были написаны на языке C как консольные приложения и не
были привязаны к использованию какой-либо конкретной среды
программирования.
Использование таких примеров, как показал опыт преподавания
данной дисциплины, не слишком удобно: в них отсутствует привычный
графический интерфейс, они сложнее воспринимаются как при отладке,
так и при выполнении. При переносе этого кода в приложение с
традиционным Windows-интерфейсом приходится вносить много
изменений в проекты. Например, использование библиотеки MFC
накладывает изрядное количество ограничений на взаимодействие
объектов в многопоточной среде, способы порождения и синхронизации
потоков. Кроме того, нужно знать, какие библиотеки следует подключать
для того, чтобы воспользоваться теми или иными возможностями.
Поэтому в настоящем учебном пособии автору хотелось бы привести
примеры программирования сетевых приложений именно с Windowsинтерфейсом
и с использованием библиотеки MFC. Собственно, на
учебных занятиях в компьютерных классах именно эти примеры в
настоящее время и используются.
Все исходные коды, сгруппированные по темам учебного курса,
доступны в локальной сети факультета. Проекты структурированы по
темам учебного курса. Предполагаемый результат находится в папке
Solution. Стартовый проект (заготовка с предлагаемым интерфейсом)
находится в папке Starter. Как правило, стартовый проект содержит
пользовательский интерфейс, чтобы студенты не тратили время на его
разработку. В ряде случаев в нем также проделана часть рутинной работы:
подключение библиотек, заголовочных файлов, объявление некоторых
констант и переменных. Иногда также присутствует реализация некоторых
обработчиков событий. Инструкции по выполнению задания помещены в
файл ToDo.doc. Там используется следующее соглашение о шрифтах: код,
который должен быть добавлен в проект, набран полужирным шрифтом.
Обычный шрифт означает, что данный код в проекте уже присутствует.
3
Стр.3
Во избежание недоразумений автору хотелось бы обратить внимание
на одну особенность нумерации предлагаемых примеров программ.
Поскольку некоторые из рассматриваемых в учебном курсе тем не
предполагают выполнения практических заданий, названия глав в данном
пособии не полностью соответствуют таковым в учебном пособии [7]
(некоторые выпущены). Однако для удобства студентов нумерация
примеров базируется на номерах тем учебного курса и потому не является
сплошной.
Изначально в качестве среды разработки предполагалось использование
Microsoft Visual Studio версии 6.0, поскольку именно эта среда
выступает в качестве основной при изучении курса "Программирование в
Windows". Однако все проекты легко (автоматически) конвертируются для
использования в более свежих версиях Visual Studio. По крайней мере,
вплоть до Visual Studio 2008 никаких проблем с преобразованием проектов
автор не заметил.
Следует отметить, что в настоящем учебном пособии нет никаких
сведений теоретического плана – только практические примеры. Вся необходимая
предварительная информация содержится, например, в учебном
пособии [7]. Кроме того, предполагается, что читатели знают язык
программирования C++, умеют пользоваться одной из версий среды
Microsoft Visual Studio, имеют опыт работы с библиотекой MFC. Особое
внимание следует обратить на навыки разработки многопоточных MFCприложений,
понимание и умение использовать средства синхронизации,
предоставляемые этой библиотекой и Win32 API. В качестве издания, где в
достаточно компактном виде изложен весь необходимый материал, можно
порекомендовать [6].
Во всех примерах для организации работы с сетью используются
только Win32 API-функции. Читателям, интересующимся более высокоуровневыми
средствами, например классами библиотеки MFC для работы
в сети, можно порекомендовать обратиться к книгам Олафсена,
Скрайбера и Уайта [3], Круглински, Уингоу и Шеферда [4], а также к
документации MSDN. Однако для понимания устройства и работы этих
классов все же настоятельно рекомендуется изучить использование
соответствующих функций Win32 API.
4
Стр.4
Интерфейс NetBIOS
В рамках данной темы предполагается отработать основные операции
для организации передачи данных с использованием сетевого интерфейса
NetBIOS.
Сначала рассматривается вопрос об организации передачи данных в
рамках модели "сервер – клиент" с установлением соединения. Для этого
мы разработаем четыре приложения:
•
•
•
•
клиентское приложение, предназначенное для работы с эхо-сервером;
эхо-сервер на основе использования функций обратного вызова;
эхо-сервер, основанный на модели событий.
Далее разбирается пример организации передачи данных в виде
дейтаграмм без установления постоянного соединения. В качестве примера
читателям предлагается разработать приложение, которое может
выступать в роли как отправителя, так и получателя дейтаграмм.
Пример 1.1. Библиотека общих функций для
приложений NetBIOS
Конечной целью данного задания является разработка библиотеки
функций, выполняющих типичные для приложения NetBIOS задачи:
работа с номерами LANA, настройка среды NetBIOS, работа с таблицами
имен и т. п. Эта библиотека (результирующий файл NbCommon.lib) будет
нами использоваться для разработки уже конкретных приложений,
использующих интерфейс NetBIOS.
Создание проекта
С использованием мастера AppWizard сгенерируем проект
статической Win32 библиотеки с именем NbCommon. В процессе
прохождения шагов генерации отметим флажок поддержки MFC, но не
будем использовать Pre-compiled Header.
Заголовочный файл библиотеки
Файл nbcommon.h содержит директивы для подключения необходимых
системных заголовочных файлов, а также прототипы функций,
образующих нашу библиотеку. Модификатор extern "C" необходим для
успешной компоновки в Visual Studio приложений, использующих данную
библиотеку.
Содержание файла nbcommon.h приводится ниже:
#include
#include
5
библиотеку общих функций для приложений NetBIOS (используются
как сервером, так и клиентом);
Стр.5