ebook img

Основы разработки сетевых Windows-приложений PDF

212 Pages·1.31 MB·Russian
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Основы разработки сетевых Windows-приложений

Министерство образования и науки Российской Федерации Федеральное агентство по образованию Ярославский государственный университет им. П.Г.Демидова В.В. Васильчиков Основы разработки сетевых Windows-приложений Учебное пособие Рекомендовано Научно-методическим советом университета для студентов специальностей "Прикладная математика и информатика" и "Математическое обеспечение и администрирование информационных систем" Ярославль 2007 УДК ББК В Рекомендовано Редакционно-издательским советом университета в качестве учебного издания. План 2007 года Рецензенты: кандидат физико-математических наук С.И. Щукин; кафедра теории и методики обучения информатике ЯГПУ им. К.Д. Ушинского Васильчиков, В.В. Основы разработки сетевых Windows- В приложений : учебное пособие / В.В. Васильчиков ; – Яросл. гос. ун-т. – Ярославль : ЯрГУ, 2007. – 212 с. ISBN Рассмотрены основные моменты разработки сетевых приложений для платформы Win32, сетевые функции Windows, а также наиболее распространенные сетевые протоколы. Рекомендуется студентам, обучающимся по специальностям 010501 Прикладная математика и информатика (дисциплина специализации "Программирование в Windows и сетях Windows") и 010503 Математическое обеспечение и администрирование информационных систем (дисциплина специализации "Програм- мирование в сетях Windows") очной формы обучения. Библиогр.: 5 назв. УДК ББК © Ярославский государственный университет, 2007 © В.В.Васильчиков, 2007 2 Введение Данное учебное пособие написано на основе лекционного курса по программированию в сетях Windows, читавшегося автором для студентов факультета ИВТ ЯрГУ, обучающихся по специальности "Математическое обеспечение и администрирование информационных систем". В пособии рассмотрены существующие технологии и Win32 API- функции, использующиеся для создания сетевых приложений различных версий ОС Windows. При этом все, что говорится о Windows 2000, остается в силе и для более свежих версий операционной системы. Первые главы посвящены рассмотрению несколько устаревших, однако все еще использующихся технологий: интерфейса NetBIOS, перенаправителей Windows, почтовых ящиков и именованных каналов. Далее рассматривается API-интерфейс Winsock, наиболее распространен- ные сетевые протоколы Winsock, базовая модель программирования клиент-сервер и соответствующие функции, предоставляемые Win32 API. При этом основное внимание уделялась программированию протоколов, построенных на базе протокола IP. Наконец, последняя глава коротко описывает основные моменты работы с сервером удаленного доступа RAS, используемого для коммутируемого доступа к Интернет. Основная часть учебного материала и исходных кодов взята из книги Джонса и Оланда [1]. Все примеры программ написаны на языке С и не привязаны к использованию какой-либо конкретной среды программиро- вания. При этом для организации работы с сетью используются только Win32 API- функции. Читателям, интересующимся более высокоуров- невыми средствами, например классами библиотеки MFC для работы в сети, можно порекомендовать обратиться к книгам Олафсена, Скрайбера и Уайта [3], Круглински, Уингоу и Шеферда [4], а также к документации MSDN. Однако для понимания устройства и работы этих классов все же настоятельно рекомендуется изучить использование соответствую- щих функций Win32 API. Для удобства использования все исходные коды, сгруппированные по темам учебного курса, (а на них в тексте пособия постоянно встречаются ссылки) доступны в локальной сети факультета. Для лабораторных занятий студентам предлагаются задания по разра- ботке программ, функционально эквивалентных рассмотренным, однако имеющих привычный оконный интерфейс. В качестве среды разработки предполагается использование Microsoft Visual Studio версии 6.0. Проекты структурированы по темам учебного курса. Предполагаемый результат находится в папке Solution. Стартовый проект (заготовка с предлагаемым интерфейсом) находится в папке Starter. Инструкции по выполнению задания помещены в файл ToDo.doc. 3 Интерфейс NetBIOS Network Basic Input/Output System (NetBIOS) – стандартный интерфейс прикладного программирования, разработанный еще в 1983 году. Он определяет программный интерфейс для сетевой связи, но не обуславливает физический способ передачи данных по сети. В 1985 году фирма IBM сформировала цельный протокол NetBIOS Extended User Interface (NetBEUI), интегрированный с интерфейсом NetBIOS. Впоследствии его реализовали и для протоколов TCP/IP и IPX/SPX. В настоящее время NetBIOS используется многими приложениями и операционными системами, включая все варианты Windows (Windows CE не дает возможности использовать NetBIOS API). NetBIOS и сетевая модель OSI Модель Open Systems Interconnect (OSI) обеспечивает высоко- уровневое представление сетевых систем. Для описания сетевых концепций она использует семь уровней (см. рисунок): 4 • прикладной – предоставляет пользовательский интерфейс для передачи данных между программами; • представительский – форматирует данные; • сеансовый – управляет связью между двумя узлами; • транспортный – обеспечивает передачу данных (надежную или ненадежную); • сетевой – поддерживает механизм адресации между узлами и маршрутизацию пакетов данных; • канальный – управляет взаимодействием между узлами на физическом уровне, отвечает за группировку данных, передаваемых по физическому носителю; • физический – физический носитель, ответственный за передачу данных в виде электрических сигналов. Здесь, правда, следует заметить, что, несмотря на частое упоминание в литературе по компьютерным сетям, модель OSI обладает изрядной условностью. Она была изначально спроектирована без готовой реализации, и потому распределение функций между уровнями не всегда очевидно, ряд функций выполняется сразу на нескольких уровнях. Конкретные реализации могут использовать не все уровни, редко, например, используются уровень представления и сеансовый уровень. Если говорить о NetBIOS, то в модели OSI он относится к сеансовому и транспортному уровню. Интерфейс Microsoft NetBIOS В известном смысле интерфейс NetBIOS не зависит от сетевого протокола. Если приложение разработано согласно спецификации NetBIOS, оно может использовать и протокол TCP/IP, и IPX/SPX, и NetBEUI. Однако оба связывающихся компьютера должны иметь хотя бы один общий сетевой протокол. Кроме того, не все протоколы по умолчанию реализуют интерфейс NetBIOS. Например, Microsoft TCP/IP и NetBEUI поддерживают, а IPX/SPX нет. Однако при установке IPX/SPX можно в окне свойств поставить флажок, с помощью которого включается поддержка NetBIOS для данного сетевого протокола. Следует также учитывать, что NetBEUI – немаршрутизируемый протокол. Если между клиентом и сервером есть маршрутизатор, то связаться они не смогут. Для TCP/IP и IPX/SPX такого ограничения не существует. Номера LANA Основное понятие интерфейса NetBIOS – это номера сетевых адаптеров (Local Area Network Adapter, LANA). Первоначально каждому 5 физическому сетевому адаптеру присваивалось уникальное значение – номер LANA. Номер LANA соответствует уникальным сочетаниям сетевого адаптера с транспортным протоколом. Например, если на компьютере установлено две сетевых платы и два поддерживающих NetBIOS сетевых протокола, то их сочетаниям будет присвоено четыре номера LANA. Эти номера лежат в диапазоне от 0 до 9, и операционная система назначает их без какого-либо определенного порядка, за исключением того, что LANA 0 – номер по умолчанию. Некоторые старые приложения жестко запрограммированы на работу только с LANA 0. Для работы с ними можно вручную назначить этот номер конкретному сетевому протоколу. Имена NetBIOS Приложение регистрирует имя на каждом номере LANA, с которым ему требуется связаться. Имя NetBIOS имеет длину 16 символов, причем 16 символ зарезервирован для специальных целей (определяет сетевую службу Microsoft, более подробно этот вопрос не рассматриваем). В среде Win32 каждый процесс имеет таблицу имен для каждого доступного номера LANA (не более 254 имен с номерами от 1 до 254, номера 0 и 255 зарезервированы для системы). Есть два типа имен NetBIOS: уникальное и групповое. Имена компьютеров в сетях Microsoft – имена NetBIOS. Когда компьютер загружается, он регистрирует свое уникальное имя на сервере WINS (Windows Internet Naming Server). Сервер WINS поддерживает список всех зарезервированных имен NetBIOS. Вместе с именем может храниться информация и о протоколе. Например, в сетях TCP/IP запоминает IP-адрес компьютера. Групповые имена используются, чтобы отправлять или получать данные, предназначенные для множества получателей. NetBIOS предлагает как службы, требующие установления соединения (сеанс связи), так и службы, которые его не требуют (дейтаграммные). В первом случае доставка данных гарантируется. Сервер обычно регистрирует себя под определенным известным именем, а клиенты ищут это имя, чтобы связаться с сервером. При использовании дейтаграммных служб сервер регистрируется под конкретным именем, а клиент просто посылает данные в сеть на NetBIOS- имя серверного процесса, не устанавливая соединения. При этом не тратится время и ресурсы на установление соединения, однако отсутствуют гарантии доставки и порядка сообщений. Основы программирования NetBIOS API-интерфейс NetBIOS содержит всего одну функцию: UCHAR Netbios (PNCB pncb ); 6 Все объявления функций, константы и т.п. определены в заголовочном файле Nb30.h. Для компоновки требуется только одна библиотека – Netapi32.lib. Параметр функции Netbios является указателем на блок сетевого управления (network control block, NCB). Структура NCB определена следующим образом: typedef struct _NCB { UCHAR ncb_command; UCHAR ncb_retcode; UCHAR ncb_lsn; UCHAR ncb_num; PUCHAR ncb_buffer; WORD ncb_length; UCHAR ncb_callname[NCBNAMSZ]; UCHAR ncb_name[NCBNAMSZ]; UCHAR ncb_rto; UCHAR ncb_sto; void (CALLBACK *ncb_post) (struct _NCB *); UCHAR ncb_lana_num; UCHAR ncb_cmd_cplt; UCHAR ncb_reserve[10]; HANDLE ncb_event; } NCB, *PNCB ; Не все поля структуры используются при каждом вызове, поэтому перед заполнением структуры ее есть смысл обнулить. Некоторые из полей являются выходными значениями. Ниже описано значение каждого поля: • ncb_command – указывает выполняемую команду Netbios. Логическое сложение с флагом ASYNCH (0x80) приводит к асинхронному выполнению; • ncb_retcode – код возврата для данной операции; • ncb_lsn – номер локального сеанса; • ncb_num – номер локального сетевого имени; • ncb_buffer – буфер данных; • ncb_length – размер буфера в байтах; • ncb_callname – имя удаленного приложения; • ncb_name – имя приложения; • ncb_rto – тайм-аут для операций приема в единицах по 500 милли- секунд. • ncb_sto – тайм-аут для операций отправки в единицах по 500 миллисекунд. • ncb_post – адрес процедуры, которую надо вызвать по завершении асинхронной команды. Ее формат: 7 void CALLBACK PostRoutine (PNCB pncb); Здесь pncb – указатель на блок сетевого управления завершенной команды. • ncb_lana_num – номер LANA для выполнения команды; • ncb_cmd_cplt – код возврата, то же самое значение, что и ncb_retcode; • ncb_reserve – зарезервировано, должно быть равно 0; • ncb_event – указывает описатель объекта события Windows в свободном состоянии, после завершения асинхронной команды событие переходит в занятое состояние. Синхронный и асинхронный вызов Большинство команд, выполняемых через вызов функции, можно вызвать синхронно (т.е. функция не возвратит управление, пока команда не будет выполнена), либо асинхронно. Для асинхронного вызова команды необходимо в поле ncb_command установить флаг ASYNCH. В этом случае требуется либо определить вызываемую после выполнения команды процедуру (поле ncb_post), либо дескриптор события (поле ncb_event). Типовые процедуры NetBIOS Общие функции приложений NetBIOS Ниже приводится исходный код основных функций типичного клиентского или серверного приложения, реализующего асинхронную модель NetBIOS. Полный код содержится в файле Nbcommon.c. #include <windows.h> #include <stdio.h> #include <stdlib.h> #include "nbcommon.h" // Перечислит ьвсе номера LANA int LanaEnum(LANA_ENUM *lenum) { NCB ncb; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (PUCHAR)lenum; ncb.ncb_length = sizeof(LANA_ENUM); if (Netbios(&ncb) != NRC_GOODRET) { printf("ERROR: Netbios: NCBENUM: %d\n", ncb.ncb_retcode); 8 return ncb.ncb_retcode; } return NRC_GOODRET; } // // Сбор сведений о LANA, перечисленны хв структуре LANA_ENUM. // Настройка среды NetBIOS (макс. число сеансов, макс. размер // таблицы имен), использовани епервого NetBIOS–имени. // int ResetAll(LANA_ENUM *lenum, UCHAR ucMaxSession, UCHAR ucMaxName, BOOL bFirstName) { NCB ncb; int i; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBRESET; ncb.ncb_callname[0] = ucMaxSession; ncb.ncb_callname[2] = ucMaxName; ncb.ncb_callname[3] = (UCHAR)bFirstName; for(i = 0; i < lenum->length; i++) { ncb.ncb_lana_num = lenum->lana[i]; if (Netbios(&ncb) != NRC_GOODRET) { printf("ERROR: Netbios: NCBRESET[%d]: %d\n", ncb.ncb_lana_num, ncb.ncb_retcode); return ncb.ncb_retcode; } } return NRC_GOODRET; } // // Добавление указанного имени данному LANA. // Возвращает номер для зарегистрированно гиомени. // int AddName(int lana, char *name, int *num) { NCB ncb; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBADDNAME; ncb.ncb_lana_num = lana; 9 memset(ncb.ncb_name, ' ', NCBNAMSZ); strncpy(ncb.ncb_name, name, strlen(name)); if (Netbios(&ncb) != NRC_GOODRET) { printf("ERROR: Netbios: NCBADDNAME[lana=%d;name=%s] %:d\n", lana, name, ncb.ncb_retcode); return ncb.ncb_retcode; } *num = ncb.ncb_num; return NRC_GOODRET; } // // Добавление данного группового имени NetBIOS данному LANA. // Возвращает номер добавленног оимени. // int AddGroupName(int lana, char *name, int *num) { NCB ncb; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBADDGRNAME; ncb.ncb_lana_num = lana; memset(ncb.ncb_name, ' ', NCBNAMSZ); strncpy(ncb.ncb_name, name, strlen(name)); if (Netbios(&ncb) != NRC_GOODRET) { printf("ERRO NRe:tbios N:CBADDGRNAME[lana=%d;name %=d%\sn]:", lana, name, ncb.ncb_retcode); return ncb.ncb_retcode; } *num = ncb.ncb_num; return NRC_GOODRET; } // // Удаление данного имени NetBIOS из таблицы имен // для данного LANA // int DelName(int lana, char *name) { NCB ncb; ZeroMemory(&ncb, sizeof(NCB)); ncb.ncb_command = NCBDELNAME; ncb.ncb_lana_num = lana; 10

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.