anthony jones jim ohiund network programmln for windows · 2010-04-19 · Инфракрасные...

601
Anthony Jones Jim Ohiund N e t w o r k P r o g r a m m l n f o r Microsoft® W i n d o w s M i c r o s o f t P r e s s

Upload: others

Post on 27-Jul-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

  • A n t h o n y J o n e s

    J i m O h i u n d

    N e t w o r k

    P r o g r a m m l n

    f o r

    M i c r o s o f t ®

    W i n d o w s

    M i c r o s o f t P r e s s

  • Э. Джонс, Д. Оланд

    Программированиев сетяхMicrosoft®

    W i n d o w si ! " э :

    МАСТЕР-КЛАСС

    « . Р У С С К А Я Р Е Д А К Ц И Я

    о Москва • Санкт-Петербург • ХарЩсов • Минск2002

  • |,К 004.43

    Ж 32.973.26-018

    иконе Э., Оланд Д ж .

    i 0 Программирование в сетях Microsoft Windows. Мастер-класс. / Пер. с англ. —

    Спб.: Питер, М: Издательско-торговый дом «Русская Редакция», 2002. — 608 стр.: ил.

    ISBN 5 - 3 1 8 - 0 0 7 2 5 - 2

    ISBN 5 - 7 5 0 2 - 0 1 4 8 - 1

    Книга знакомит читателя с многообразием сетевых функций ОС семей-ства Windows. Обсуждается разработка сетевых приложений на платформеWin32 с использованием интерфейсов программирования NetBIOS и Winsock,а также распространенных протоколов. На конкретных примерах рассмот-рены клиент-серверная модель; установка соединения и передача данных;регистрация и разрешение имен, в том числе применительно к Windows 2000и Active Directory; широковещание в сети; ATM; QoS и удаленный доступ.В приложениях содержится справочник команд NetBIOS (с указанием вход-ных и выходных параметров), сведения о новых функциях IP Helper, а так-же справочник кодов ошибок Winsock.

    Адресована как профессиональным программистам, так и новичкам, длякоторых станет удобным справочником и исчерпывающим пособием поиспользованию сетевых функций Windows

    Состоит из 15 глав, трех приложений и предметного указателя; прилагаемыйкомпакт-диск содержит примеры программ.

    УДК 004.43

    ББК 32.973.26-018

    Подготовлено к изданию по лицензионному договору с Microsoft Corporation, Редмонд, Ва-шингтон, США

    Intel — охраняемый товарный знак компании Intel Corporation Active Directory, ActiveX,Authenticode, BackOffice, BizTalk, JScnpt, Microsoft, Microsoft Press, MSDN, MSN, NetMeeting,Outlook, Visual Basic, Win32, Windows и Windows NT являются товарными знаками или охра-няемыми товарными знаками корпорации Microsoft в США и/или других странах Все дру-гие товарные знаки являются собственностью соответствующих фирм

    Все названия компаний, организаций и продуктов, а также имена лиц и события, ис-пользуемые в примерах, вымышлены и не имеют никакого отношения к реальным компани-ям, организациям, продуктам, событиям и лицам, если особо не указано иное

    г© Оригинальное издание на английском

    1BN 0 - 7 3 5 6 - 0 5 6 0 - 2 (англ.) языке, Microsoft Corporation, 2000IBN 5 - 3 1 8 - 0 0 7 2 5 - 2 © Перевод на русский язык, Microsoft

    ' 5 - 7 5 0 2 - 0 1 4 8 - 1 Corporation, 2001

  • Оглавление

    Введение XII

    Ч А С Т Ь I. УСТАРЕВШИЕ СЕТЕВЫЕ API 1

    ГЛАВА 1. Интерфейс NetBIOS 2Интерфейс Microsoft NetBIOS 3

    Номера LANA 4Имена NetBIOS 5Особенности NetBIOS 8

    Основы программирования NetBIOS 9Синхронный и асинхронный вызов 11

    Типичные процедуры NetBIOS 11Сервер сеансов: модель асинхронного обратного вызова 19Сервер сеансов: модель асинхронных событий 24Клиент сеанса NetBIOS 30

    Дейтаграммные операции 34Дополнительные команды NetBIOS 48

    Проверка состояния адаптера (команда NCBASTAT) 49Команда поиска имени (NCBFINDNAME) 51Сопоставление протоколов номерам LANA 51

    Рекомендации по выбору платформ 52Платформа Windows СЕ 52Платформа Windows 9x 52Для любых платформ 53

    Резюме 53

    ГЛАВА 2. Перенаправитель 54Универсальные правила именования 55Поставщик нескольких UNC 55Компоненты сетевого доступа 56Перенаправитель 57Протокол SMB 57Безопасность 59

    Дескрипторы безопасности 59Маркеры доступа 61

    Сетевая безопасность 61Реквизиты сеанса 61

    Пример 62Резюме 63

    ГЛАВА 3. Почтовые ящики 64Подробности внедрения почтовых ящиков 64

    Имена почтовых ящиков 65)Л * Размеры сообщений 650С| Компиляция приложения 67

    Коды ошибок 67

  • Оглавление

    )бщие сведения об архитектуре клиент-сервер 67Сервер почтовых ящиков 67Клиент почтовых ящиков 70

    1,ополнительные API-функции почтовых ящиков 72Тлатформа и производит ельность 7 3

    Правила именования < 8 3 > 7 3Неспособность отменить блокирующие запросы ввода-вывода 74Утечки памяти 76

    'езюме 77"ЛАВА 4. Именованные каналы 78[етали реализации именованных каналов 79

    Правила именования каналов 79Режимы побайтовый и сообщений 79Компиляция приложений 79Коды ошибок 80

    1ростой сервер и клиент 80Детали реализации сервера 80Усовершенствованный сервер каналов 87Детали реализации клиента 95

    1,ругие API-вызовы 981латформа и производительность 101'езюме 101

    Ч А С Т Ь I I . ИНТЕРФЕЙС ПРИКЛАДНОГО1РОГРАММИРОВАНИЯ WINSOCK 103

    "ЛАВА 5. Сетевые протоколы 104Характеристики протоколов 104

    Протокол, ориентированный на передачу сообщений 104Обмен данными, с соединением и без него 106Надежность и порядок доставки сообщений 1 Об

    Сорректное завершение работы 107Широковещание данных 108Многоадресное вещание 108Качество обслуживания 108Фрагментарные сообщения 109Маршрутизация 109Другие характеристики 109

    Тоддерживаемые протоколы 110Сетевые протоколы, поддерживаемые Win32 110Сетевые протоколы в Windows СЕ 112

    Информация о протоколе 112Зокеты Windows 116

    Простые сокеты 118Информация о платформах 118

    Winsock и модель OSI 119Зыбор соответствующего протокола 1195езюме 120

  • Оглавление VII

    ГЛАВА 6. Семейства адресов и разрешение имен 121Протокол IP 121

    Протокол TCP 121Протокол UDP 122

    Адресация 122Порядок байт 124Создание сокета 125Разрешениеимен 125

    Инфракрасные сокеты 128Адресация 128Разрешение имен 128Нумерация IrDA-устройств 129Опрос IAS 131Создание сокета 133Параметры сокета 133

    Протоколы IPX/SPX 13 3Адресация 133Создание сокета 134Разрешение имен 137

    Протоколы NetBIOS 137Адресация 137Создание сокета 139

    Протокол AppleTalk 140Адресация 140Создание сокета 148

    Протокол ATM 148Адресация 149Создание сокета 153Привязка сокета к SAP 154Разрешениеимен 155

    Дополнительные функции Winsock 2 155Резюме 156ГЛАВА 7. Основы Winsock 157Инициализация Winsock 157Проверка и обработка ошибок 159Протоколы с установлением соединения 160

    Серверные API-функции 1б0API-функции клиента 164Передача данных 168Потоковые протоколы 173Завершение сеанса 175Пример 176

    Протоколы, не требующие соединения 185Приемник 185Отправитель 187Протоколы, ориентированные на передачу сообщений 188Освобождение ресурсов сокета 189Пример 189

  • ЛИ Оглавление

    1,ополнительные функции APIФункция getpeernameФункция getsocknameФункция WSADuphcateSocketФункция TransmitFile

    \пя платформы Windows СЕ1ругие семейства адресов

    Протокол AppleTalkИнфракрасные сокетыИнтерфейс с NetBIOSПротокол IPX/SPXПротокол ATM

    'езюме

    "ЛАВА 8. Ввод-вывод в Winsock'ежимы работы сокетов

    Блокирующий режимНеблокирующий режим

    Додели ввода-вывода сокетовМодель selectМодель WSAAsyncSelectМодель WSAEventSelectМодель перекрытого ввода-выводаМодель портов завершения

    'равнение моделей ввода-выводаКлиентСервер

    5езюме

    "ЛАВА 9. Параметры сокета и команды управленияSBOflOM-ВЫВОДОМ

    Тараметры сокетаУровень SOLJOCKETУровень параметров SOLAPPLETALKУровень параметров SOL IRLMPУровень параметров IPPROTOJPУровень параметров IPPROTOTCPУровень параметров NSPROTO IPX

    Функции Ioctlsocket и WSAloctlСтандартные ioctl-командыДругие ioctl-командыIoctl-команды Secure Socket LayerIoctl-команды для ATM

    Резюме

    "ЛАВА 10. Регистрация и разрешение именвведениеМодели пространства именПеречень пространств имен

    Регистрация службы

    197197198198199200201201202202203204204

    205

    206206208209209213217223234243243243243

    245

    245246255258262267268272273274282283285

    286

    286287287289

  • FОпределение класса службыРегистрация службы

    Запрос к службеСоздание запросаЗапрос к DNS

    Резюме

    ГЛАВА 11. Многоадресная рассылкаСемантика многоадресной рассылки

    Свойства многоадресной рассылкиМногоадресная рассылка в сетях IP

    Протокол IGMPЛистовые узлы IPРеализация 1Р-рассылки

    Многоадресная рассылка в сетях ATMЛистовые узлы ATMКорневые узлы ATM

    Оглавление

    Многоадресная рассылка с использованием WinsockРассылка средствами Winsock 1Рассылка средствами Winsock 2Общие параметры WinsockОграничение многоадресной рассылки

    Резюме

    ГЛАВА 12. Качество обслуживанияВведение

    Протокол RSVPСетевые компонентыКомпоненты приложенияКомпоненты политики безопасности

    QoS и WinsockСтруктуры QoSФункции, вызывающие QoS

    Завершение QoSОбъекты, относящиеся к поставщику

    Программирование QoSRSVP и типы сокетовУведомления QoSШаблоны QoS

    ПримерыОдноадресный TCPОдноадресный UDPМногоадресный UDP

    ATM и QoSРезюме

    ГЛАВА 13. Простые сокетыСоздание простого сокетаПротокол ICMP

    Пример Ping

    при удаленном доступе

    IX

    289293299301304307

    308

    308311

    зп312313314314315315316316323340342342343343344344346347348349352356356365366368371373373394395396397398398399401

  • Оглавление

    Программа Traceroute 411Протокол IGMP 412Использование IPJiDRINCL 414Резюме 424

    "ЛАВА 14. Интерфейс Winsock 2 SPI 425Основы SPI 426

    Соглашения SPI об именах 426Соответствие функций Winsock 2 API и SPI 426

    Поставщики транспортной службы 427Функция WSPStartup 428Описатели сокетов 433Поддержка модели ввода-вывода Winsock 435Модель select 437Расширенные функции 446Установка поставщиков транспортной службы 447

    Тоставщики службы пространства имен 453Установка поставщика пространства имен 453Реализация пространства имен 455Пример 461

    Отладочные функции отслеживания Winsock 2 SPI 466Резюме 467

    "ЛАВА 15. Элемент управления Winsock 468Свойства 468

    Методы 470События 471Пример (UDP-приложение) 472

    Пересылка UDP-сообщений 476Прием UDP-сообщений 477Получение информации от элемента Winsock 478Запуск UDP-приложения 478Состояние UDP-сокетов 479

    11ример (TCP-приложение) 480СР-сервер 487

    TCP-клиент 489Получение информации о состоянии элементауправления Winsock 490Запуск TCP-приложения 490Состояние ТСР-сокетов 491

    Ограничения 491Гипичные ошибки 493

    Ошибка Local address in use 493Ошибка Invalid Operation at Current State 493

    Элемент управления Windows СЕ Winsock 494Пример 494Проблема с элементом управленияVBCE Winsock 499

    Резюме 499

  • Оглавление XI

    Ч А С Т Ь I I I . СЛУЖБА УДАЛЕННОГОДОСТУПА (RAS) 500

    ГЛАВА 16. Клиент службы RAS 501Компиляция и компоновка 502Структуры данных и вопросы совместимости платформ 503Обновление DUN 1.3 и Windows 95 503Функция RasDial 503

    Синхронный режим 506Асинхронный режим 507Уведомление о состоянии 512Завершение соединения 513

    Телефонный справочник 514Добавление записей в телефонный справочник 522Переименование записи телефонного справочника 525Удаление записей из телефонного справочника 525Перечисление записей телефонного справочника 526Управление реквизитами пользователя 527Многоканальные подзаписи телефонного справочника 529

    Управление соединением 530Резюме 534Приложение А. Перечень команд NetBIOS 535

    Приложение В. Вспомогательные функции IP 549Возможности утилиты Ipconfig 549

    Освобождение и обновление IP-адресов 553Изменение IP-адреса 554

    Возможности утилиты Netstat 554Получение таблицы TCP-соединений 555Получение таблицы прослушиваемых портов UDP 556Получение статистики о протоколе IP 557

    Возможности утилиты Route 561Получение таблицы маршрутов 562Добавление маршрута 564Удаление маршрута 565

    Утилита ARP 565Добавление записи ARP 567Удаление записи ARP 567

    Приложение С. Коды ошибок Winsock 568

    От авторов 575

    Предметный указатель 576

    if-Г

  • Введение

    Перед вами книга, посвященная сетевым функциям Windows 9х, NT 4, 2000и СЕ Она предназначена в первую очередь опытным программистам и спе-циалистам по сетям Впрочем, для начинающих она может послужить полез-ным справочным пособием и даже вводным курсом по сетевым функциям

    О чем эта книгаВ книге три части, посвященные работе в сети с применением NetBIOS и пе-ренаправителя Windows, Winsock и RAS соответственно

    В главе 1 рассматривается NetBIOS По нашему опыту работы в командеподдержки разработчиков Microsoft мы знаем, что многие компании все ещеиспользуют эту технологию Между тем, до сих пор нет адекватного руковод-ства по написанию приложений NetBIOS для платформ Win32 В главе 1 так-же приводятся методы написания надежных и переносимых приложений (сучетом, что многие разработчики используют NetBIOS именно для связи сустаревшими системами)

    Главы 2-4 посвящены перенаправителю Windows, почтовым ящикам иименованным каналам Как вы знаете, почтовые ящики и именованные ка-налы основаны на перенаправителе Мы решили посвятить перенаправите-лю целую главу, чтобы предоставить читателю базовую информацию о том,как три эти технологии соотносятся друг с другом Почтовые ящики — этоненадежный однонаправленный ориентированный на сообщения интер-фейс прикладного программирования, не зависимый от доступных в систе-ме протоколов Именованные каналы обладают более широкими возможно-стями, обеспечивая надежную двустороннюю дейтаграммную или поточнуюпередачу данных Эти каналы используют средства безопасности WindowsNT за счет перенаправителя, на что не способен ни один другой сетевой API-интерфейс

    Вторая часть книги посвящена API-интерфейсу Winsock Глава 5 — этовведение в Winsock, где рассказывается о наиболее распространенных про-токолах Winsock Все приложения Winsock должны создавать сокет для осу-ществления связи В этой главе мы приводим основную информацию о воз-можностях каждого протокола, а в главе б — подробное описание, как со-здать сокет и разрешить имя для каждого типа протокола

    В главе 7 — самое интересное Здесь мы представляем базовую модель про-граммирования клиент-сервер и описываем большинство функций Winsock,которые относятся к установлению и приему связи, передаче данных и г пДалее, в главе 8 рассказывается о методах ввода-вывода в Winsock Так как глава7 задумывалась как введение в указанную тему, в ней обсуждаются только про-стейшие методы ввода-вывода В главе 8, напротив, эти методы описаны под-

  • Введение

    робно Если вы новичок в работе с Winsock, то главы 5-7 помогут вам овла-деть основами использования этого API-интерфейса

    Остальные главы этой части книги посвящены особым аспектам и воз-можностям Winsock Параметры сокетов и команды управления вводом-вы-водом рассмотрены в главе 9 Именно здесь вы найдете описаниебольшинства команд, влияющих на работу сокета или даже протокола На-деемся, эта глава будет полезна, как в учебных, так и в справочных целях

    В главе 10 рассмотрена регистрация и разрешение имен служб в адресабазового протокола в Winsock 2 Это независимый от протокола метод Рас-пространение Windows 2000 и Active Directory придает данной главе особуюзначимость

    Глава 11 посвящена связи «точка — много точек>>, включая многоадресноеIP- вещание и ATM В главе 12 описана захватывающая технология — Qualityof Service (QoS), позволяющая гарантировать выделение пропускной способ-ности сети для приложений В главе 13 рассказывается о простых 1Р-соке-тах мы рассматриваем, как приложения Winsock могут использовать их дляработы с протоколами ICMP и IGMP, а также другие аспекты программиро-вания при помощи простых сокетов

    В главе 14 описан интерфейс поставщика службы для Winsock — средства,при помощи которого программист может задать уровень между Winsock ипоставщиками служб более низких уровней (например, TCP/IP) для управ-ления работой сокета и протокола, регистрацией и разрешением имен Этотсложный инструмент позволяет расширить функциональность Winsock

    И наконец, в главе 15 обсуждается элемент управления Microsoft VisualBasic для Winsock Мы решили включить эту главу в книгу, так как убедились,что многие разработчики до сих пор полагаются на Visual Basic и этот эле-мент Функциональность элемента Winsock ограничена и не позволяет ис-пользовать дополнительные новые свойства Winsock, но он незаменим длятех, кому требуется простая и легкая в использовании сетевая связь в VisualBasic

    Часть III посвящена клиентскому серверу удаленного доступа (RemoteAccess Server, RAS) Мы решили включить в книгу главу о RAS из-за популяр-ности Интернета и широкого распространения коммутируемого доступа кнему Возможность коммутируемого доступа в сетевом приложении оченьполезна, так как упрощает работу пользователя с программой То есть конеч-ному пользователю не придется думать, как установить соединение, чтобыработать с сетевым приложением

    В конце книги — три приложения Приложение А — справочник по ко-мандам NetBIOS, который, по нашему мнению, для программистов бесцененВ нем перечислены параметры ввода и вывода для каждой команды В при-ложении В описаны новые вспомогательные функции IP, выдающие полез-ную информацию о сетевой конфигурации текущего компьютера Приложе-ние С — справочник по кодам ошибок Winsock с подробным описанием от-дельных ошибок и возможных причин их возникновения

  • XIV Введение

    Мы надеемся, что наша работа станет для вас ценным учебным и справоч-ным пособием. Думаем, что это наиболее полная книга о сетевом програм-мировании для Windows.

    Как пользоваться прилагаемымкомпакт-дискомВ тексте книги мы часто приводим примеры программ, иллюстрирующие ра-боту с обсуждаемыми сетевыми API-интерфейсами. Эти примеры записаны наприлагаемый компакт-диск. Для их установки вставьте компакт-диск в диско-вод, и программа Autorun запустит программу установки. Программу установ-ки можно также инициировать вручную, запустив файл PressCD.exe из корне-вого каталога компакт-диска. Вы вправе установить образцы кода на компь-ютер или работать с ними прямо с компакт-диска (из папки Examples\Chap-ters\Chapter XX).

    ПРИМЕЧАНИЕ Для работы с компакт-диском необходима 32-битнаяОС Windows.

    Наряду с примерами программ в состав компакт-диска ыключена послед-няя версия Microsoft Platform SDK. Мы сделали это, потому что многие изнаших примеров рассчитаны на современные заголовочные файлы и биб-лиотеки, которые появились только после Windows 2000 Beta 3.

    ПоддержкаАвторы приложили все усилия, чтобы обеспечить точность содержания кни-ги и прилагаемого к ней компакт-диска. Издательство Microsoft Press публи-кует постоянно обновляемый список исправлений и дополнений к своимкнигам по адресу http://mspress.microsoft.com/support/.

    Многие определения функций и таблицы в книге адаптированы или пе-реизданы с разрешения и при активном участии группы документированияMicrosoft Platform SDK. Часть материала основана на предварительно разра-ботанной документации и может претерпеть изменения. Информацию, об-новления и исправления ошибок по последней версии SDK см. на Web-узле MSDN по адресу: http://msdn.microsoft.com/developer/sdk/platform.asp.

    Если все же у вас возникнут вопросы или вы захотите поделиться свои-ми предложениями или комментариями, обращайтесь в издательство Mic-rosoft Press по одному из этих адресов:

    [email protected] PressAttn: Network Programming for Microsoft Windows EditorOne Microsoft WayRedmond, WA 98052-6399

  • Ч А С Т Ь I

    УСТАРЕВШИЕСЕТЕВЫЕ API

    о

    Первая часть издания посвящена сетевому интерфейсу NetBIOS, перенапра-вителю и типам использующих его сетевых соединений. Хотя в книге в ос-новном обсуждается программирование средствами Winsock, мы включилив нее часть I, так как устаревшие сетевые API имеют некоторые преимуще-ства перед Winsock.

    В главе 1 рассматривается интерфейс NetBIOS, который, как и Winsock,является независимым от протокола сетевым API. NetBIOS обеспечиваетасинхронные вызовы, а также совместимость со старыми операционнымисистемами типа OS/2, DOS и др. В главе 2 обсуждается перенаправитель, скоторым связаны две следующие темы: почтовые ящики (глава 3) и имено-ванные каналы (глава 4). Перенаправитель обеспечивает независимый оттранспорта ввод-вывод файлов. Почтовые ящики — это простой интерфейс,который помимо прочего поддерживает широковещание и однонаправлен-ное взаимодействие между компьютерами под управлением Windows. Нако-нец, именованные каналы дают возможность использовать двусторонний ка-нал связи, который поддерживает функции безопасности Windows.

  • Г Л А В А

    Интерфейс NetBIOS

    Network Basic Input/Output System (NetBIOS) — стандартный интерфейсприкладного программирования (application programming interface, API),разработанный Sytek Corporation для IBM в 1983 г. NetBIOS определяет про-граммный интерфейс для сетевой связи, но не обусловливает физическийспособ передачи данных по сети. В 1985 г. IBM предприняла попытку сфор-мировать цельный протокол — создала NetBIOS Extended User Interface (Net-BEUI), интегрированный с интерфейсом NetBIOS. Программный интерфейсNetBIOS вскоре приобрел такую популярность, что поставщики ПО началиреализовать его для других протоколов, таких как TCP/IP и IPX/SPX. В на-стоящее время NetBIOS используют платформы и приложения во всем мире,включая многие компоненты Windows NT, Windows 2000, Windows 95 иWindows 98.

    ПРИМЕЧАНИЕ Windows СЕ не дает возможности использовать Net-BIOS API, хотя поддерживает транспортный протокол TCP/IP, именаNetBIOS и механизм их разрешения.

    В Win32 интерфейс NetBIOS обеспечивает обратную совместимость состарыми приложениями. В этой главе обсуждаются главные принципы про-граммирования с помощью NetBIOS, начиная с имен NetBIOS и номеровLANA. Мы рассмотрим основные услуги, предлагаемые NetBIOS, включая те,что обеспечивают связь с установлением соединения или без такового (дей-таграммные). В каждом разделе будет приведен простой клиент-серверныйпример. Завершит главу обзор типичных ошибок. В приложении А вы най-дете список команд NetBIOS с обязательными параметрами и кратким опи-санием.

    Сетевая модель 0SIМодель Open Systems Interconnect (OSI) обеспечивает высокоуровне-вое представление сетевых систем. Ее семь уровней полностью опи-сывают фундаментальные сетевые концепции: от приложения до спо-соба физической передачи данных. Вот эти уровни:Я прикладной — предоставляет пользовательский интерфейс для

    передачи данных между программами;

    • представительский — форматирует данные;

    Ш сеансовый — управляет связью между двумя узлами;

  • I J • l-\ •_# r-i

    Ш транспортный — обеспечивает передачу данных (надежную илиненадежную);

    И сетевой — поддерживает механизм адресации между узлами имаршрутизацию пакетов данных;

    • канальный — управляет взаимодействием между узлами на физи-ческом уровне; отвечает за группировку данных, передаваемых пофизическому носителю;

    II физический — физический носитель, ответственный за переда-чу данных в виде электрических сигналов.

    В этой модели NetBIOS относится к сеансовому и транспортномууровням.

    Интерфейс Microsoft NetBIOSКак уже упоминалось, существуют реализации NetBIOS API для разных сете-вых протоколов, что делает интерфейс независимым от протокола. Иначеговоря, если вы разработали приложение согласно спецификации NetBIOS,оно может использовать протоколы TCP/IP, NetBEUI или даже IPX/SPX. Этаполезная особенность позволяет корректно написанному приложению Net-BIOS выполняться почти на любом компьютере, независимо от физическойсети. Однако есть несколько нюансов. Чтобы два приложения NetBIOS мог-ли связаться друг с другом по сети, они должны выполняться на рабочихстанциях, имеющих по крайней мере один общий транспортный протокол.Например, если на компьютере Джона установлен только TCP/IP, а на ком-пьютере Мэри — только NetBEUI, приложения NetBIOS на компьютере Джо-на не смогут связаться с приложениями на компьютере Мэри.

    Кроме того, только определенные протоколы реализуют интерфейс Net-BIOS. Например, Microsoft TCP/IP и NetBEUI делают это по умолчанию, a IPX/SPX — нет. Поэтому Microsoft предлагает реализующую этот интерфейс вер-сию IPX/SPX, что следует учесть при проектировании сети. При установкепротоколов обычно видно, поддерживает ли версия протокола IPX/SPX воз-можности NetBIOS. Например, вместе с Windows 2000 поставляется NWLinkIPX/SPX/NetBIOS Compatible Transport Protocol — то, что этот протокол под-держивает NetBIOS, прямо вытекает из его названия. В Windows 95 и Win-dows 98 в окне свойств протокола IPX/SPX есть флажок, с помощью которо-го включается поддержка NetBIOS для IPX/SPX.

    Важно, что NetBEUI — немаршрутизируемый протокол. Если между кли-ентом и сервером есть маршрутизатор, приложения на этих компьютерах несмогут связаться. Маршрутизатор будет отбрасывать пакеты по мере их при-ема. TCP/IP и IPX/SPX — маршрутизируемые протоколы и не имеют такогоограничения. Так что если вы твердо запланировали использовать NetBIOS,задействуйте в сети по крайней мере один из маршрутизируемых транспор-тных протоколов. Характеристики протоколов и рекомендации по их выбо-ру мы приводим в главе 6.

  • ЧАСТЬ I Устаревшие сетевые API

    Номера LANAКакое отношение имеют транспортные протоколы к NetBIOS с точки зре-ния программирования' Ключ к пониманию NetBIOS — номера сетевыхадаптеров (LAN Adapter, LANA). В первоначальных реализациях NetBIOSкаждому физическому сетевому адаптеру присваивалось уникальное значе-ние — номер LANA. В Win32 это стало проблематичным, так как рабочаястанция может иметь и множество сетевых протоколов, и множество платсетевого интерфейса.

    Номер LANA соответствует уникальным сочетаниям сетевого адаптера странспортным протоколом. Так, если рабочая станция имеет две сетевыхплаты и два поддерживающих NetBIOS транспорта (например, TCP/IP иNetBEUI), будет присвоено четыре номера LANA. Номера могут соответство-вать сочетаниям адаптера с протоколом примерно следующим образом:

    0 — «TCP/IP — сетевой адаптер 1»;

    1 — «NetBEUI — сетевой адаптер 1»;

    2 — «TCP/IP — сетевой адаптер 2»;

    3 — «NetBEUI — сетевой адаптер 2».

    Номера LANA лежат в диапазоне от 0 до 9, и операционная система на-значает их без какого-либо определенного порядка Кроме LANA 0, которыйимеет особый смысл — это номер «по умолчанию» Когда появился интер-фейс NetBIOS, большинство операционных систем поддерживало един-ственный номер LANA и многие приложения были жестко запрограммиро-ваны на работу только с LANA 0. Для обратной совместимости вы можетевручную назначить LANA 0 конкретному протоколу

    В Windows 95 и Windows 98 можно открыть диалоговое окно свойств се-тевого протокола с помощью значка Network в Control Panel. Выберите вклад-ку Configuration в диалоговом окне Network, затем из списка компонентов —сетевой протокол и щелкните кнопку Properties Вкладка Advanced диалогово-го окна свойств для каждого протокола, поддерживающего NetBIOS, содержитфлажок Set This Protocol To Be The Default Protocol Пометка флажка пере-страивает привязки протоколов так, чтобы протоколу по умолчанию былназначен LANA 0 Этот флажок можно пометить только для одного прото-кола Поскольку Windows 95 и Windows 98 поддерживают Plug-and-Play, нетребуется явно задавать приоритет протоколов.

    Windows NT 4 допускает большую гибкость в установке NetBIOS На вклад-ке Services диалогового окна Network выберите NetBIOS Interface из спискаNetwork Services и щелкните кнопку Properties. В диалоговом окне NetBIOSConfiguration вы можете явно назначить номера LANA всем сочетаниям се-тевого интерфейса с транспортным протоколом В этом диалоговом окнесетевой интерфейс определяется именем его драйвера. Впрочем, имена про-токолов не всегда говорят сами за себя. На рис 1 -1 показано диалоговое окноNetBIOS Configuration. Оно свидетельствует: на компьютере установлено двасетевых адаптера и три транспортных протокола — TCP/IP (NetBT), NetBEUI(Nbf) и IPX/SPX (NwlnkNb). Щелкнув кнопку Edit, вы можете вручную назна-чить номера LANA для отдельных протоколов.

  • ГЛАВА 1 Интерфейс NetBIOS

    NetBIOS Configuration

    Use thts здвеп to change Hie lane numbei on theisted NeiffiOS network raises

    000001002003004

    i>erj NetworkBisute „ „ . „ _ _ „ ,Nbf->IEEPRO->IEEPR02NetBT •> IEEPR0 •> IEEPRO2NwlnkNb > NwlnklpxNbf-> E100B •> E100B1NetBT -> E100B -> E100B1

    Рис. 1-1. Диалоговое окно NetBIOS Configuration

    Windows 2000 также позволяет напрямую назначать номера LANA. В Cont-rol Panel щелкните значок Network And Dial-up Connections. Далее выберитев меню Advanced команду Advanced Settings и в открывшемся диалоговомокне настройте параметры на вкладке LANA numbers.

    При разработке устойчивого приложения NetBIOS всегда пишется код,который может обрабатывать соединения на любом номере LANA. Предпо-ложим, Мэри пишет серверное приложение NetBIOS, которое слушает кли-ентов на LANA 2. На компьютере Мэри LANA 2 соответствует протоколу TCP/IP. Далее Джон решает написать клиентское приложение для связи с серве-ром Мэри, так что его приложение будет связываться через LANA 2 на егорабочей станции; однако, LANA 2 на компьютере Джона соответствует Net-BEUI. Приложения не смогут связаться друг с другом, хотя им доступны про-токолы TCP/IP и NetBEUI. Чтобы устранить это несоответствие, серверноеприложение Мэри должно слушать клиентские соединения на каждом дос-тупном номере LANA на рабочей станции Мэри. Аналогично, клиентскоеприложение Джона должно пытаться связаться на каждом номере LANA, до-ступном на его компьютере. Так Мэри и Джон смогут гарантировать успехсвязи их приложений. Конечно, наличие кода, который может обрабатыватьсоединения на любом номере IANA не означает, что этот код будет работать,если у двух компьютеров не найдется ни одного общего протокола.

    Имена NetBIOSТеперь перейдем к именам NetBIOS. Процесс — или, если угодно, приложе-ние — регистрирует имя на каждом номере LANA, с которым ему требуетсясвязаться. Имя NetBIOS имеет длину 16 символов; 1б-й символ зарезерви-рован для специальных целей. При добавлении имени в таблицу имен, выдолжны очистить буфер имен. В среде Win32 каждый процесс имеет табли-цу имен NetBIOS для каждого доступного номера LANA. Добавление имен.идля LANA 0 означает, что приложение доступно только клиентам, соединяю-щимся на этом LANA 0. Максимально к каждому номеру LANA могут бытьДобавлены 254 имени, они пронумерованы от 1 до 254 (0 и 255 зарезерви-

  • Устаревшие сетевые API

    рованы для системы) Впрочем, каждая ОС задает максимальный номер поумолчанию, меньший 254 Вы вправе его изменить при переопределениикаждого номера LANA

    Есть два типа имен NetBIOS уникальное и групповое Никакой другойпроцесс в сети не может зарегистрировать уже имеющееся уникальное имябудет выдана ошибка дублирования имени Как вам, наверное, известно, име-на компьютеров в сетях Microsoft — имена NetBIOS Когда компьютер загру-жается, он регистрирует свое имя на локальном сервере Windows InternetNaming Server (WINS), который сообщает об ошибке, если другой компью-тер уже использует то же имя Сервер WINS поддерживает список всех заре-гистрированных имен NetBIOS

    Вместе с именем могут храниться и сведения о протоколе Например, всетях TCP/IP WINS запоминает IP-адрес компьютера, зарегистрировавшегоимя NetBIOS Если сеть сконфигурирована без сервера WINS, компьютерыпроверяют, нет ли в сети такого же имени, путем широковещательной рас-сылки сообщения Если никакой другой компьютер не оспаривает сообще-ние, сеть позволяет отправителю использовать заявленное имя

    Групповые имена используются, чтобы отправлять или, наоборот, полу-чать данные, предназначенные для множества получателей Имя группы необязательно должно быть уникальным Групповые имена используются длямногоадресной рассылки

    16-й символ в именах NetBIOS определяет большинство сетевых службMicrosoft Имена служб и групп для WINS-совместимых компьютеров серверWINS регистрирует напрямую, а для регистрации имен других компьютеровприменяется широковещание по локальной подсети Чтобы получить ин-формацию о зарегистрированных на локальном (или удаленном) компью-тере именах NetBIOS, используйте утилиту Nbtstat В табл 1-1 приведены све-дения о зарегистрированных именах NetBIOS, которые команда Nbtstat -nвыдала для пользователя Davemac, вошедшего в компьютер, конфигуриро-ванный как основной контроллер домена и работающий под управлениемWindows NT Server вместе с Internet Information Server

    Табл. 1-1. Таблица имен NetBIOS

    Имя

    DAVEMAC 1

    DAVEMAC 1

    DAVEMACD

    DAVEMACD

    DAVEMACDDAVEMAC 1

    Inet~Services

    IS~DAVEMAC1

    16-йбайт

    DAVEMAC 1+++++++

    Тип имени

    УникальноеУникальное

    Групповое

    Групповое

    УникальноеУникальное

    Групповое

    Уникальное

    Служба

    Имя службы рабочей станцииИмя службы сервера

    Имя домена

    Имя контроллера домена

    Имя координатора сети

    Имя отправителя

    Групповое имя Internet InformationServerУникальное имя Internet InformationServerУникальное имя сетевого монитора

  • Г Л А В А 1 Интерфейс NetBIOS

    I

    Утилита Nbtstat устанавливается вместе с протоколом TCP/IP Она може!также опрашивать таблиц имен на удаленных компькл ерах, используя пара-метр -а с именем удаленного компьютера или параметр -А с ei о IP-адресом

    Перечислим стандартные значения 1б-го байта, добавляемые в конец уни-кальных NetBIOS-имен компьютеров разными сетевыми службами Microsoft

    Ш — имя службы рабочей станции (NetBIOS-имя компьютера),

    • — имя службы сообщений, используемое при получении и отправ-ке сообщений, зарегистрировано сервером WINS для службы сообщенийна клиенте WINS и обычно добавляется в конец имени компьютера и вошедшего в систему пользователя,

    • — имя координатора сети (master browser) домена, определяет ос-новной контроллер домена и указывает, каких клиентов и других обозре-вателей использовать для контакта с координатором сети домена,

    Я — серверная служба удаленного доступа (RAS),

    • — служба сетевого динамического обмена данными (Network Dy-namic Data Exchange, NetDDE),

    Ш — имя службы на сервере, используемое для предоставления точекподключения к общим файлам,

    • — клиент RAS,

    • — агент сетевого монитора,

    • — утилита Network Monitor (Сетевой монитор)

    А теперь перечислим заданные по умолчанию символы 1б-го байта, до-бавляемые в конец обычно используемых групповых имен NetBIOS

    • — групповое имя домена, содержащее список определенных адре-сов компьютеров, которые его зарегистрировали Контроллер домена этоимя регистрирует WINS обрабатывает его как доменную группу каждыйчлен группы должен индивидуально обновить свое имя или будет исклю-чен Доменная группа ограничена 25 именами Если в результате репли-кации статическое 1С-имя конфликтует с динамическим 1С-именем надругом сервере WINS, для соответствующих участников добавляется ком-бинированная запись, которая помечается как статическая Если записьстатическая, члены группы не должны обновлять свои IP-адреса

    Ш — имя координатора сети (master browser), используемое клиента-ми для обращения к нему В подсети может быть лишь один координаторСерверы WINS возвращают положительный ответ на регистрацию име-ни домена, но не сохраняют это имя в своих базах данных Если компью-тер посылает запрос на имя домена серверу WINS, тот возвращает отри-цательный ответ Если компьютер, сделавший запрос, сконфигурированкак h- или m-узел, он затем выполняет широковещателыгую рассылку зап-роса имени, чтобы разрешить его Тип узла определяет способ разреше-ния имени клиентом Клиенты, сконфигурированные для разрешения врежиме b-узла, выполняют широковещательную рассылку пакетов дляоповещения о себе и разрешения имен NetBIOS При разрешении в ре-

  • ЧАСТЬ I Устаревшие сетевые API

    жиме р-узла связь с сервером WINS осуществляется в стиле «точка — точ-ка». При разрешении имен в режиме m-узла (смешанном) сначала задей-ствуется режим b-узла, а затем при необходимости — режим р-узла. Пос-ледний метод разрешения — h-узел (гибридный). В этом режиме снача-ла применяется регистрация и разрешение в режиме р-узла, а в случаенеудачи — в режиме b-узла. По умолчанию в Windows используется ре-жим п-узла.

    щ — обычное групповое имя. Обозреватели могут выполнять широко-вещательную рассылку для данного имени и слушать на нем, чтобы выб-рать координатора сети. Эти широковещательные рассылки эффективнылишь в локальной подсети и не ретранслируются маршрутизаторами.

    Ш — имя Интернет-группы. Регистрируется серверами WINS, чтобыидентифицировать группы компьютеров в административных целях. На-пример, можно зарегистрировать групповое имя «printersg» для иденти-фикации административной группы серверов печати.

    Ш _MSBROWSE_ — добавляется в конец имени домена вместо 1б-го симво-ла. Это имя широковещательно рассылается по локальной подсети, что-бы сообщить о домене другим ее координаторам.

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

    Особенности NetBIOSNetBIOS предлагает и требующие логического соединения службы, и служ-бы без установления соединения (дейтаграммные). Первые позволяют двумобъектам устанавливать сеанс или виртуальный канал между ними. Сеанс —двусторонний коммуникационный поток, по которому объекты обменива-ются сообщениями. Требующие сеанса службы гарантируют доставку любыхданных между двумя конечными точками. Сервер обычно регистрирует себяпод определенным известным именем, и клиенты ищут это имя, чтобы свя- -заться с сервером. Применительно к NetBIOS, процесс сервера добавляет егоимя в таблицу имен для каждого номера LANA, с которым требуется связь.Клиенты на других компьютерах преобразуют имя службы в имя компьюте-ра и затем запрашивают соединение у серверного процесса. Как видите, дляустановления такой цепочки необходимо предварительно выполнить опре-деленные действия, поэтому инициализация соединения связана с некото-рыми издержками. При установлении сеанса гарантируется доставка паке-тов и их порядок, хотя связь и основана на сообщениях. То есть если под-ключенный клиент направит команду чтения, сервер вернет только одинпакет данных в потоке, даже если клиент обеспечил буфер для приема не-скольких пакетов.

  • I J I # - * V г-л

    При использовании служб, не требующих логического соединения (дей-таграммных), сервер регистрируется под конкретным именем, и клиент про-сто собирает данные и посылает их в сеть, не устанавливая заранее никако-го соединения. Клиент направляет данные на NetBIOS-имя серверного про-цесса. Дейтаграммные службы эффективнее, поскольку не тратят время иресурсы на установление соединения.

    С другой стороны, дейтаграммные службы не дают гарантий доставки ипорядка сообщений. Например, клиент отправляет тысячи байтов данных насервер, который два дня назад был остановлен из-за отказа. Отправитель ни-когда не получит никаких уведомлений об ошибке, если только не ожидаетответа от сервера (если в течение достаточно длительного периода време-ни нет отклика, то можно понять, что что-то не так).

    Основы программирования NetBIOSТеперь обсудим API-интерфейс NetBIOS. Он элементарен, поскольку содержитТОЛЬКО ОДНУ фуНКЦИЮ:

    UCHAR Netbios(PNCB pNCB);

    Все объявления функций, константы и т. п. для NetBIOS определены в за-головочном файле. Единственная библиотека, необходимая для компонов-ки приложений NetBIOS — Netapi32.1ib. Наиболее важная особенность этойфункции — параметр pNCB, который является указателем на блок сетевогоуправления (network control block, NCB). Это — указатель на структуру NCB,содержащую всю информацию, требуемую функции Netbios для выполнениякоманды NetBIOS. Определяется эта структура так:

    typedef struct _NCB

    ' UCHAR ncb_command;'- UCHAR ncb_retcode;, UCHAR ncb_lsn;

    JJ UCHAR ncb_num;, PUCHAR ncb.buffer;

    WORD ncb_length;UCHAR ncb_callname[NCBNAMSZ];UCHAR ncb_name[NCBNAMSZ];UCHAR ncb_rto;

    4 UCHAR ncb.sto;

    1 void (*ncb_post) (struct _NCB * ) ;

    UCHAR ncb_lana_num;

    ;. UCHAR ncb_cmd_cplt;

    UCHAR ncb_reserve[10];HANDLE ncb_event;

    \ * PNCB, NCB;

    He все члены структуры будут использоваться в каждом вызове NetBIOS;некоторые из полей данных являются выходными параметрами (другимисловами, задаются по возвращении из вызова Netbios). Один важный совет:

  • 1 О ЧАСТЬ I Устаревшие сетевые API

    всегда обнуляйте структуру NCB до вызова Netbios. В следующем списке опи-сано назначение каждого поля.

    Ш ncb_command — указывает выполняемую команду NetBIOS. Многие ко-манды могут выполняться синхронно или асинхронно поразрядным ло- \гическим сложением флага ASYNCH (0x80) и команды.

    И ncbjretcode — определяет код возврата для данной операции. Функцияприсваивает этому полю значение NRC_PENDING, когда происходит асин-хронная операция.

    • neb Isn — определяет номер локального сеанса, уникально идентифици-рующий его в текущем окружении. Функция возвращает новый номер се-анса после успешной команды NCBCALL или NCBLISTEN.

    Ш ncb_num — указывает номер локального сетевого имени. Новый номер воз-вращается для каждого вызова команды NCBADDNAME или NCBADDGRNAME.Используйте корректный номер со всеми дейтаграммными командами.

    Ш ncbbuffer — указывает на буфер данных. Для команд, которые отправ-ляют данные, этот буфер содержит отправляемые данные; для команд,которые получают данные, — данные, возвращаемые функцией Netbios.Для других команд, типа NCBENUM, буфер будет предопределенной струк-турой LANAJ.NUM.

    Ш ncb_length — указывает длину буфера в байтах. Для команд приема Netbiosприсваивает этому полю значение, равное количеству полученных байтов.Если буфер недостаточно велик, Netbios возвращает ошибку NRC_BUFLEN.

    Ш ncbcallnatne — указывает имя удаленного приложения.

    • ncb_name — указывает имя, под которым известно приложение.

    • ncbrto — указывает время ожидания (тайм-аут) для операций приема.Значение определено в 500-миллисекундных единицах (0 — означаетнулевое время ожидания) и задано для команд NCBCALL и NCBLISTEN, чтовлияет на последующие команды NCBRECV.

    • ncbsto — указывает время ожидания для операций отправки. Значениеопределяется в 500-миллисекундных единицах (0 — означает нулевоевремя ожидания) и задано для команд NCBCALL и NCBLISTEN, что влияетна последующие команды NCBSEND и NCBCHAINSEND.

    Ш ncb_post — указывает адрес процедуры, которую надо вызвать по завер-шении асинхронной команды. Функция определена как

    void CALLBACK PostRoutine(PNCB pncb);

    тдерпсЬ указывает на блок сетевого управления завершенной команды.

    • ncb_lana_num — указывает номер LANA для выполнения команды.

    • ncbcmdcplt — определяет код возврата для операции. Netbios присва-ивает этому полю значение NRCJPENDING, когда происходит асинхрон-ная операция.

    • ncb_reserve — зарезервировано, должно быть равно 0.

  • Г Л А В А 1 Интерфейс NetBIOS "И

    • neb event — указывает описатель объекта события Windows в свободном(nonsignaled) состоянии. Когда асинхронная команда завершается, собы-тие переходит в занятое (signaled) состояние. Следует использовать толь-ко ручной сброс событий. Это поле должно быть равно 0, если в полеneb command не задан флаг ASYNCH или если значение ноля nebjjost от-лично от О. Иначе Netbios возвращает ошибку NRCJLLCMD.

    Синхронный и асинхронный вызовВы можете вызвать функцию Netbios синхронно или асинхронно. Все коман-ды NetBIOS синхронны — это означает, что вызов Netbios блокируется, покакоманда не завершит работу. При вызове команды NCBLISTEN запрос к Netbiosне возвращается, пока клиент не установит соединение или не произойдетошибка.

    Для асинхронного вызова выполните логическую операцию OR над ко-мандой NetBIOS и флагом ASYNCH. При использовании флага ASYNCH необ-ходимо определить вызываемую после выполнения команды процедуру вполе ncb_post, либо описатель события в поле nebjsvent. Когда асинхроннаякоманда выполнена, Netbios возвращает значение NRC_GOODRET (0x00), нополю ncb_cmd_cplt присваивается значение NRC_PENDING (OxFF). Крометого, функция Netbios задает полю ncb_cmd_cplt структуры NCB значениеNRC_PENDING, пока команда не завершится. По завершении команды полюncb_cmd_cplt присваивается значение, возвращенное командой. После сво-его завершения Netbios также присваивает полю ncb_retcode свой код воз-врата.

    Типичные процедуры NetBIOSВ этом разделе мы исследуем типичное серверное приложение NetBIOS. Сна-чала изучим сервер, так как его конструкция диктует действия клиента. По-скольку большинство серверов предназначено для обслуживания несколькихклиентов одновременно, асинхронная модель NetBIOS подойдет лучше все-го. Мы обсудим примеры серверов, использующих как асинхронные проце-дуры обратного вызова, так и модель событий. Однако для начала предста-вим исходный текст, который реализует некоторые обычные функции, не-обходимые большинству прикладных программ NetBIOS. Листинг 1-1 взятиз файла Nbcommon.c, который вы найдете на прилагаемом компакт-дискев папке \Examples\ChapterO 1\Соттоп, Функции из этого файла используют-ся во многих примерах книги.

    Листинг 1-1. Типичные процедуры NetBIOS (Nbcommon.c)

    // Nbcommon.c

    «include

    ((include

    «include

    см. след. стр.

  • 1 2 ЧАСТЬ I Устаревшие сетевые API

    Листинг 1 - 1 . (продолжение)

    «include 'nbcommon h"

    //

    // Перечисляются все номера LANA

    //

    int LanaEnum(LANA_ENUM «lenum)

    {

    NCB neb,

    ZeroMemory(&ncb, sizeof(NCB));neb ncb_command = NCBENUH;neb ncb_buffer = (PUCHAR)lenum;neb ncb_length = sizeof(LANA_ENUH);if (Netbios(&ncb) i= NRC_GOODRET)

    {prmtfC'ERROR- Netbios: NCBENUM: Xd\n", neb. ncb_retcode);return ncb.ncb_retcode;

    >return NRC_G00DRET;

    // Сброс всех сведений о LANA, перечисленных в структуре LANA_ENUM,// а также настройка среды NetBIOS (максимальное количество сеансов,// максимальный размер таблицы имен),и использование первого NetBIOS-имени.

    //int ResetAll(LANA_ENUM *lenum, UCHAR ucMaxSession,

    UCHAR ucMaxName, BOOL bFirstName){

    NCB neb;int i;

    ZeroMemory(&ncb, sizeof(NCB));nob.ncb_command = NCBRESET;ncb.ncb_callname[O] = ucMaxSession;ncb.ncb_callname[2] = ucMaxName;ncb.ncb_callname[3] = (UCHAR)bFlrstName;

    f o r ( i = 0; l < lenum->length,

    neb ncb_lana_num = lenum->lana[i];if (Netbios(&ncb) 1= NRC_GOODRET){

    printf("ERROR Netbios NCBRESET[Xd]: Xd\n"neb ncb_lana_num, ncb.ncb_retcode);

    return ncb.ncb_retcode;

  • Г Л А В А 1 Интерфейс NetBIOS 13

    Листинг 1-1. (продолжение)

    return NRC_G00DRET,

    // Добавление указанного имени данному LANА. Возвращает номер// для зарегистрированного имени

    //

    int AddName(mt lana, char «name, int *num){

    NCB neb,

    ZeroMemory(&ncb, sizeof(NCB));neb ncb_command = NCBADDNAME,neb ncb_lana_num = lana;memset(ncb.ncb_name, ' ', NCBNAMSZ);strncpy(ncb.ncb_name, name, strlen(name));

    if (Netbios(&ncb) i= NRC_GOODRET)

    {pnntf ("ERROR Netbios NCBADDNAME[lana=Xd;name=Xs]: Xd\n",

    lana, name, neb ncb_retcode);return neb ncb_retcode;

    >" *num = neb ncb_num;

    return NRC_G0ODRET,

    // Добавление указанного группового имени NetBIOS данному LANA// Возвращение номера добавленного имени.//int AddGroupName(int lana, char «name, int *num){

    NCB neb;

    ZeroMemory(&ncb, sizeof(NCB));neb ncb_command = NCBADDGRNAME;ncb.ncb_lana_num = lana,memset(ncb.ncb_name, ' ', NCBNAMSZ);strncpy(ncb.nob_name, name, strlen(name));

    if (Netbios(&ncb) i= NRC_G00DRET){

    printfC ERROR Netbios NCBADDGRNAME[lana=Xd;name=Xs]: Xd\n",lana, name, neb ncb_retcode);

    return neb ncb_retcode;}*num = neb.ncb_num,

    см. след. стр.

  • 1 4 ЧАСТЬ I Устаревшие сетевые API

    Листинг 1-1. (продолжение)

    return NRCJ300DRET;

    // Удаление данного имени NetBIOS из таблицы имен,

    // связанной с номером LANA

    //int DelName(int lana, char *name)

    {

    NCB neb;

    ZeroMemory(&ncb, sizeof(NCB));neb ncb_command = NCBDELNAME,neb ncb_lana_num = lana;memset(ncb.ncb_name, ' , NCBNAMSZ),strncpy(ncb.ncb_name, name, strlen(name));

    if (Netbios(Sncb) ' = NRC_GOODRET){

    pnntf ("ERROR: Netbios NCBADDNAME[lana=!(d; name=Xs]: Xd\n"lana, name, neb.ncb_retcode);

    return neb.ncb_retcode;}return NRC_GOODRET;

    // Отправка len байт из буфера данных по указанному сеансу (lsn) \ ,

    // и номеру lana , s

    // . ^

    int Send(int lana, int lsn, char «data, DWORD len) Д

    { - tnt

    NCB neb, }

    int retcode; y^i*

    ZeroMemory(&ncb, sizeof(NCB));

    ncb.ncb_command = NCBSEND,

    ncb.ncb_buffer = (PUCHAR)data,

    ncb.ncb_length = len;

    ncb.ncb_lana_num = lana;

    ncb.ncb_lsn = lsn,

    «Iretcode = Netbios(&ncb);

    Itreturn retcode; ,i

    // Прием не более len байт в буфер данных по указанному сеансу

  • Г Л А В А 1 Интерфейс

    Листинг 1 - 1 . (продолжение)

    Ц (lsn) и номеру lana//int Recv(int lana, mt lsn, char «buffer, DWORD *len){

    NCB neb;

    ZeroMemory(&ncb, sizeof(NCB));ncb.ncb_command = NCBRECV;ncb.ncb_buffer = (PUCHAR)buffer;ncb.ncb_length = *len;ncb.ncb_lana_num = lana;ncb.ncb_lsn = lsn;

    if (Netbios(&ncb) != NRC.GOODRET)

    {•len = -1;return ncb.ncb_retcode;

    >*len = ncb.ncb_length;

    return NRC_GOODRET;

    }//// Прекращение указанного сеанса на данном номере lana

    //int Hangup(int lana, int lsn)

    NCBint

    ZeroMemory(&ncb,neb.neb.neb.

    neb.neb.neb

    .command =

    .lsn = lsnlana num

    neb;retcode;

    sizeof(NCB));NCBHANGUP;

    = lana;

    retcode = Netbios(&nob);

    return retoode;}

    //// Отмена данной асинхронной команды, указанной в параметре-структуре NCB//int Cancel(PNCB pneb){

    NCB neb;

    ZeroMemory(&ncb, sizeof(NCB));см. след. стр.

  • 1 6 ЧАСТЬ I Устаревшие сетевые API

    Листинг 1 - 1 . (продолжение)

    ncb.ncb_command = NCBCANCEL;

    ncb.ncb_buffer = (PUCHAR)pncb;

    neb.ncb_lana_num = pncb->ncb_lana_num;

    if (Netbios(&ncb) != NRC_GOODRET)

    <

    printf("ERROR: NetBIOS: NCBCANCEL: Xd\n", ncb.nob_retcode);

    return ncb.ncb_retcode;} ••'

    return NRC.GOODRET;

    // Форматирование указанного имени NetBIOS, чтобы оно было пригодно для печати.

    // Непечатаемые символы заменяются точками.

    // Буфер outname содержит возвращенную строку, длина которой - минимум

    // NCBNAMSZ + 1 символов.

    //

    int FormatNetbiosName(char «nbname, char «outname){

    int i; 'Jt9ii

    strncpy(outname, nbname, NCBNAMSZ); V

    outname[NCBNAMSZ - 1] = ДО1; *» f > ' >«|. \ \\

    for(i = 0; i < NCBNAMSZ - 1; i++) \\

    { Jnr

    // Если символ непечатаемый, он заменяется точкой. )

    IIif (!((outname[i] >= 32) && (outname[i]

    Первая из типичных процедур, приведенных в файле Nbcommon.c —LanaEnum, самая распространенная: ее используют почти все приложенияNetBIOS. Эта функция перечисляет доступные номера LANA в данной систе- ..ме. Функция обнуляет структуру NCB, присваивает полю nebjoommand зна-чение NCBENUM, полю ncb_buffer— структуру LANA_ENUM и полю nebjength —значение размера структуры LANAJ5NUM. При правильной инициализацииструктуры NCB единственное действие, которое должна предпринять функ-ция LanaEnum, чтобы вызвать команду NCBENUM — вызвать функцию Netbios.Как видите, выполнить команду NetBIOS несложно. В случае синхронных ко-манд возвращаемое Netbios значение сообщит, успешно ли выполнена этакоманда. Константа NRCjGOODRETвсегда соответствует успеху.

    В случае успешного вызова NetBIOS в предоставленную структуру LA-NAJZNUM будут записаны количество номеров LANA на текущем компьюте-ре, а также фактические номера LANA. Структура LANA_ENUM определенаследующим образом:

  • Г Л А В А 1 Интерфейс NetBIOS 17

    typedef struct LANA_ENUM .

    {

    UCHAR length;

    UCHAR lana[MAX_LANA + 1 ] ;

    } LANA_ENUM, *PLANA_ENUM;

    Поле length указывает, сколько номеров LANA имеет локальный компьютер,поле lana — массив фактических номеров LANA, значение length — сколькоэлементов массива lana будет заполнено номерами LANA.

    Следующая функция — ResetAll, также используется во всех приложенияхNetBIOS. Хорошо написанная программа NetBIOS должна обнулить каждыйномер LANA, который планирует применить. Как только вы получаете струк-туру LANA_ENUM с номерами LANA от LanaEnum, можете сбросить их, вызвавкоманду NCBRESET для каждого номера LANA в структуре. Это именно то, чтоделает ResetAll; первый параметр функции — структура LANA_ENUM. Для сбро-са требуется, только чтобы функция присвоила полю neb command значениеNCBRESET, а полю ncbjanajium — номер LANA, который требуется сбросить.Хотя некоторые платформы, типа Windows 95, не требуют инициализироватькаждый используемый номер LANA, лучше все-таки это делать. Windows NTтребует инициализировать каждый номер LANA до его использования, иначелюбые другие запросы KNetbios вернут ошибку 52 (NRCjENVNOTDEF).

    Кроме того, при сбросе номера LANA вы можете задать определенныепараметры среды NetBIOS через символьные поля ncbjzallname. Другие па-раметры ResetAll соответствуют этим параметрам окружения. Функция ис-пользует параметр ucMaxSession, чтобы присвоить значение нулевому сим-волу ncb_callname, который задает максимальное количество сеансов. Обыч-но операционная система задает значение по умолчанию меньше максиму-ма. Например, в Windows NT 4 по умолчанию допустимо 64 параллельныхсеанса. ResetAll присваивает символу 2 поля ncb_callname (определяющемумаксимальное число имен NetBIOS, которые могут быть добавлены к каждо-му номеру LANA) значение параметра ucMaxName. Опять же, ОС определя-ет стандартный максимум. Наконец, ResetAll присваивает символу 3, исполь-зуемому для клиентов NetBIOS, значение своего параметра bFirstName. При-сваивая этому параметру TRUE, клиент использует имя компьютера как имяего процесса NetBIOS. В результате клиент может соединяться с сервером иотправлять данные, не принимая никаких входящих соединений. Этот пара-метр ускоряет инициализацию (добавление имени NetBIOS в локальную таб-лицу требует времени).

    Операцию добавления имени в локальную таблицу имен выполняет функ-ция AddName. Параметры: добавляемое имя и номер LANA, к которому онодобавляется. Помните, что таблица имен у каждого LANA своя, и если вы хо-тите, чтобы ваше приложение обслуживало соединения на любом доступномномере LANA, добавьте имя процесса к каждому LANA. Команда для добавле-ния уникального имени — NCBADDNAME. Другие обязательные поля — номерLANA, для которого добавляется имя, и добавляемое имя, которое должно бытьскопировано в поле ncbjiame. AddName сначала заполняет буфер ncbjiameпробелами и предполагает, что параметр пате указывает на строку с симво-

  • лом /О в конце. После успешного добавления имени Netbios возвращает в полеncbjium номер добавленного имени NetBIOS. Это значение используется длядейтаграмм (подробно мы обсудим их далее), что�