Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

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

.pdf
Скачиваний:
538
Добавлен:
11.03.2015
Размер:
3.02 Mб
Скачать

4AUI ь I Устаревшие сетевые API

А теперь перечислим все параметры командной строки, доступные для использования в программе-примере:

Ш /п:ту-пате — регистрирует уникальное имя ту-пате\

Ж/g:group-name — регистрирует групповое имя group-name;

Ш/s — отправляет дейтаграммы (по умолчанию, в примере дейтаграммы принимаются);

/с:п — отправляет или получает п дейтаграмм;

/r:receiver — определяет NetBIOS-имя для отправки дейтаграммы; Ш /Ъ — использует широковещательную посылку дейтаграмм;

Ж /а — принимает данные для любого имени NetBIOS (присваивает полю ncbjium значение OxFF);

Ш /1:п — выполняет все операции только на номере LANA n (по умолчанию все команды отправки и приема выполняются для всех номеров LANA);

/d:n — ждет п миллисекунд между отправками.

Для выполнения третьей команды запустите несколько клиентов на разных компьютерах. Она иллюстрирует случай, когда один сервер посылает одно сообщение группе, и каждый член группы, ожидающий данные, получит это сообщение.

Также попробуйте различные комбинации перечисленных команд с параметром командной строки /1-х, где х — действительный номер LANA. Этот параметр переключает программу из режима выполнения команд на всех номерах LANA в режим выполнения команд только на конкретном номере LANA. Например, команда Nbdgram /n:CLIENT01 /1:0 заставит приложение слушать входящие дейтаграммы только на LANA 0 и игнорировать любые данные, поступающие на какой-либо другой номер LANA.

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

Дополнительные команды NetBIOS

s r

Все рассмотренные нами команды так или иначе относятся к установлению сеанса, отправке или получению данных через сеанс или дейтаграмму. Но есть несколько команд, предназначенных исключительно для обработки приема информации: команда опроса состояния адаптера (NCBASTAT) и команда поиска имени (NCBFJNDNAME). Мы рассмотрим их, а затем перейдем

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

к программному сопоставлению номеров LANA протоколам — хотя это не функция NetBIOS, но в справочных целях ознакомиться с ней полезно.

Проверкасостоянияадаптера(командаNCBASTAT)

Команда опроса состояния адаптера полезна для получения информации о локальном компьютере и его номерах LANA Это единственный способ программно выяснить МАС-адрес компьютера из Windows 95 и NT 4. Функции IP Helper, появившиеся в Windows 2000 и Windows 98 (см. приложение А), предоставляют более универсальный интерфейс для выяснения МАС-адреса.

Команда и ее синтаксис довольно просты, но то, какие данные будут возвращены, зависит от способа вызова функции. Команда опроса состояния адаптера возвращает структуру ADAPTER_STATUS, сопровождаемую рядом структур NAME_BUFFER. Эти структуры определены следующим образом:

typedef struct _ADAPTER_STATUS {

 

UCHAR

adapter_address[6];

 

UCHAR

rev_major;

 

UCHAR

reservedO;

 

UCHAR

adaptsr_type;

 

UCHAR

revjninor;

 

WORD

duration;

 

> « WORD

frmr_recv;

 

WORD

frmr_xmit;

 

WORD

iframe_recv_err;

 

WORD

xmit_aborts;

 

DWORD

xmit_success;

 

DWORD

recv_success;

 

WORD

iframe_xmit_err;

 

WORD

recv_buff_unavail;

 

WORD

t1_timeouts;

 

WORD

ti_timeouts;

 

DWORD

reservedi;

 

WORD

free_ncbs;

 

WORD

max_cfg_ncbs;

 

WORD

max_ncbs;

 

WORD

xmit_buf_unavail;

 

WORD

max_dgram_size;

 

WORD

pending_sess;

 

WORD

max_cfg_sess;

 

WORD

max_sess;

 

WORD

max_sess_pkt_size;

 

WORD

name_count;

 

> ADAPTER

STATUS, *PADAPTER_STATUS;

 

typedef struct _NAME_BUFFER {

 

UCHAR

name[NCBNAHSZ];

 

UCHAR

name_num;

 

UCHAR

name_flags;

 

} NAME.BUFFER, *PNAME_BUFFER;

.IK4'f<

 

 

y o i з р е в ш и е с е т е в ы е MKI

Поля, представляющие наибольший интерес: МАС-адрес (adapter_address), максимальный размер дейтаграммы (jnax_dgram_size) и максимальное количество сеансов (max_sess). Кроме того, поле name count сообщает, сколько было возвращено структур NAME_BUFFER. Максимальное количество NetBIOS-имен на номер LANA — 254, так что вы можете обеспечить достаточно большой буфер для всех имен или вызвать команду опроса состояния адаптера с полем ncbjength, равным 0. Функция Netbios по завершении выдает необходимый размер буфера.

Поля, необходимые для вызова команды NCBASTAT-. ncb_command, ncb_ buffer, ncbjength, ncbjananum и ncbjzallname. Если первый символ поля ncb_callname — звездочка ('), команда проверки состояния выполняется, но возвращает только NetBIOS-имена, добавленные вызывающим процессом. Впрочем, если вы вызываете Netbios с командой опроса состояния адаптера, добавляете уникальное имя к таблице имен текущего процесса, а затем используете это имя в поле ncb_callname, все NetBIOS-имена, а также все имена, зарегистрированные системой, добавляются в таблицу имен локального процесса. Вы можете также проверить состояние адаптера не с того компьютера, где выполняется команда. Для этого задайте в поле ncb_callname тля удаленной рабочей станции.

ПРИМЕЧАНИЕ Помните, что во всех именах компьютеров Microsoft 1б-му байту присваивается значение 0. Кроме того, они дополняются пробелами до фиксированной длины.

Приведенная в качестве примера простая программа — Astat.c, проверяет состояние всех LANA. Кроме того, при использовании флага /1:LOCALNAME эта команда выполняется на локальном компьютере, но выдает полную таблицу имен. Флаг /r:REMOTENAME инициирует удаленный опрос для указанного имени компьютера.

При использовании команды, проверяющей состояние адаптера, нужно учитывать некоторые моменты. Во-первых, у компьютера с несколькими адаптерами будет несколько МАС-адресов. Так как NetBIOS не позволяет выяснить, к которым адаптерам и протоколам привязан LANA, разбираться в возвращенных значениях придется самостоятельно. Кроме того, если установлена служба удаленного доступа (Remote Access Service, RAS), система выделит номера LANA и для удаленных соединений. Пока соединения RAS неактивны, проверка состояния адаптера на этих LANA вернет нулевой МАСадрес. Если установлено соединение RAS, МАС-адрес будет соответствовать тому который служба RAS назначает всем своим виртуальным сетевым устройствам.

Наконец, проверку состояния удаленного адаптера вы должны выполнять по общему для обоих компьютеров транспортному протоколу. Например, системная команда Nbtstat (версия NCBASTATрдя командной строки) выполняет опрос только по TCP/IP. Если на удаленном компьютере нет TCP/IP, команда не будет выполнена.

Г Л А В А 1 интерфейс I

Командапоискаимени{NCBFINDNAME)

Эта команда доступна только в Windows NT и Windows 2000, сообщает, кто зарегистрировал данное имя NetBIOS. Чтобы успешно выполнить запрос на поиск имени, процесс должен добавить свое уникальное имя в таблицу имен. Для этого необходимо задать следующие поля: команда, номер LANA, буфер и длина буфера. Запрос вернет структуру FJND_NAME_HEADER и несколько структур FIND_NAME_BUFFER, определенных следующим образом:

typedef struct _FIND_NAME_HEADER {

WORD

node_count;

UCHAR

reserved;

UCHAR

unique_group;

} FIND_NAME_HEADER, *PFIND_NAME_HEADER;

typedef struct _FIND_NAME_BUFFER {

UCHAR

length;

UCHAR

access_control;

UCHAR

frame_control;

UCHAR

destination_addr[6];

UCHAR source_addr[6];

UCHAR

routing_info[18];

} FIND_NAME_BUFFER, *PFIND_NAME_BUFFER;

Как и в случае команды проверки состояния адаптера, если команда NCBFINDNAME выполняется с длиной буфера равной 0, функция Netbios вернет требуемую длину и ошибку NRC_BUFLEN.

Структура FIND_NAME_HEADER, которую возвращает успешный опрос, показывает, зарегистрировано ли имя как уникальное или как групповое. Если поле unique_group содержит 0 — это уникальное имя, если 1 — групповое. Поле node_count указывает, сколько было возвращено структур FIND_ NAMEJBUFFERS. Структура FIND_NAME_BUFFER возвращает совсем немного информации, большая часть которой полезна на уровне протокола. Однако нас интересуют поля destination_addr и source_addr. Поле source_addr

содержит МАС-адрес сетевого адаптера, зарегистрировавшего имя, а поле destination_addr — МАС-адрес адаптера, выполнившего запрос.

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

Если в Windows NT 4 поиск имени выполняется по протоколу TCP/IP, Netbios возвращает ложную информацию. Убедитесь, что выбран номер LANA, соответствующий транспорту, отличному от TCP/IP.

СопоставлениепротоколовномерамLANA

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

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

делять доступные транспорты. Это невозможно сделать средствами «родного» опроса NetBIOS — надо использовать Winsock 2 для Windows NT 4 и Windows 2000. Функция Winsock 2 WSAEnumProtocols возвращает информацию о доступных транспортных протоколах (подробнее о ней — в главах 5 и 6). Хотя Winsock 2 доступен в Windows 95 и, по умолчанию, в Windows 98, информация о протоколе, хранимая на этих платформах, не содержит никаких сведений о NetBIOS.

Мы не будем подробно обсуждать Winsock 2, поскольку этому интерфейсу посвящена часть II этой книги. Основные шаги следующие: загрузка Winsock 2 через функцию WSAStartup, вызов функции WSAEnumProtocols и просмотр возвращенных запросом структур WSAPROTOCOLJNFO. Пример Nbproto.c на прилагаемом компакт-диске содержит код для выполнения такого опроса.

Функция WSAEnumProtocols принимает в качестве параметров адрес буфера для блока данных и длину буфера. Сначала вызовите эту функцию с нулевыми адресом и длиной буфера. Вызов будет неудачным, но параметр длины буфера теперь содержит требуемый размер. Вызовите функцию снова — WSAEnumProtocols вернет количество найденных протоколов. Структура WSAPROTOCOLJNFO велика и содержит множество полей, но нас интересуют только szProtocol, iAddressFamily и iProtocol. Если поле iAddressFamily равно

AF_NETBIOS, то абсолютное значение iProtocol — номер LANA для протокола, указанного в строке szProtocol. Кроме того, для сопоставления возвращенного протокола предопределенному GUID протокола можно использовать

Providerld GUID.

Здесь есть один нюанс. В Windows NT и Windows 2000 поле iProtocol для любого протокола, установленного на LANA 0, имеет значение 0x80000000. Дело в том, что протокол 0 зарезервирован для специального использования; любой протокол, назначенный LANA 0, всегда будет иметь значение 0x80000000, так что надо просто проверить это значение.

Рекомендации по выбору платформ

Реализуя связь средствами NetBIOS на следующих платформах, имейте в виду следующие ограничения.

ПлатформаWindows СЕ

Интерфейс NetBIOS в Windows СЕ не доступен. Перенаправитель поддерживает имена и разрешения имен NetBIOS, но не программный интерфейс.

Платформа Windows 9x

В Windows 95 и Windows 98 есть несколько ошибок. На любой из этих платформ вы должны сбросить все номера LANA перед добавлением любого имени NetBIOS к любому номеру LANA. Так как сброс одного номера LANA разрушает таблицы имен других номеров, избегайте кода, подобного следующему.

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

53

i.ANA_ENUM lenum;

// Перечисление номеров LANA for(i = 0; i < lenum.length;

<

Reset(lenum.lana[i]); AddName(lenum.lana[i], MY_NETBIOS_NAME);

}

Кроме того, не пытайтесь асинхронно выполнить в Windows 95 команду NCBRESET на соответствующем протоколу TCP/IP номере LANA. Для начала, не следует отдавать эту команду асинхронно, так как прежде, чем вы сможете сделать что-нибудь с этим номером LANA, должен завершиться сброс. При асинхронном выполнении команды NCBRESET приложение вызовет фатальную ошибку в драйвере виртуального устройства (virtual device driver, VXD) NetBIOS TCP/IP и придется перезагружать компьютер.

Для любых платформ

При сеансовой связи одна сторона может посылать сколь угодно много данных, однако отправитель на деле буферизует посылаемые данные, пока получатель не подтвердит их получение, отдав команду приема. NetBIOS-ко- манды NCBSENDNA и NCBCHAINSENDNA — варианты команд отправки, не требующие подтверждения. Вы можете использовать их, если намеренно не хотите, чтобы команда отправки ждала подтверждения от получателя. Поскольку в нижележащем протоколе TCP/IP реализована собственная схема подтверждения, команды отправки, не требующие подтверждения от получателя, ведут себя так же, как и ожиадающие подтверждения.

Резюме

NetBIOS — мощный, но устаревший прикладной интерфейс. Одна из его сильных сторон — независимость от протокола: приложения могут работать поверх TCP/IP, NetBEUI и SPX/IPX. NetBIOS обеспечивает связь с установлением логического соединения и без такового. Значительное преимущество интерфейса NetBIOS перед Winsock — единый способ разрешения имен и регистрации. Приложение NetBIOS нуждается только в имени NetBIOS, a приложение Winsock, использующее разные протоколы, должно знать схему адресации каждого (см. часть II).

В главе 2 речь пойдет о перенаправителе — составной части почтовых ящиков и именованных каналов (о них — в главах 3 и 4).

Г Л А В А

Перенаправитель

Microsoft Windows позволяет приложениям обмениваться информацией по сети с помощью встроенных служб файловой системы, иногда называемых сетевой операционной системой (network operating system, NOS). В этой главе описываются сетевые возможности, использующие компоненты файловой системы Windows, и доступные в Windows 95, Windows 98, Windows NT, Windows 2000 и Windows СЕ. Они основаны на сетевых технологиях почтовых ящиков (mailslot) и именованных каналов (named pipe), о которых речь пойдет в главах 3 и 4.

Для доступа к локальным файлам приложения посылают запросы вводавывода операционной системы (обычно это называется локальным вводомвыводом). Например, когда приложение открывает или закрывает файл, ОС определяет устройство, на котором находится данный файл, и передает запрос ввода-вывода локальному драйверу этого устройства. Аналогично осуществляется доступ к устройствам по сети, только запрос ввода-вывода передается по сети удаленному устройству. Это называется перенаправлением ввода-вывода (I/O redirection). Например, Windows позволяет назначить имя локального диска (скажем, Е:) общей папке на удаленном компьютере. Тогда при обращении приложений к диску Е: ОС будет перенаправлять запросы ввода-вывода на устройство, называемое перенаправителем (redirector), a он — формировать канал связи к удаленному компьютеру для доступа к нужной общей папке. Это позволяет приложениям использовать для доступа к файлам по сети обычные API-функции для работы с файлами (типа ReadFile

иWriteFНе).

Вэтой главе подробно рассматривается использование перенаправителя для передачи запросов ввода-вывода на удаленные устройства (именно на этом основана связь в технологиях почтовых ящиков и именованных каналов). Сначала мы обсудим, как ссылаться на файлы в сети с помощью универсальных правил именования (Universal Naming Convention, UNC) и указателя ресурса поставщика нескольких UNC (Multiple UNC Provider, MUP). Затем поясним, как MUP вызывает сетевую службу, которая использует перенаправитель для установления связи между компьютерами по протоколу Server Message Block (SMB). В заключение — вопросы обеспечения безопасности при доступе к файлам по сети с помощью базовых операций файлового ввода-вывода.

Г Л А ВА 2 Перенаправитель

55

Универсальные правила именования

Имена UNC — это стандартный способ доступа к файлам и устройствам без назначения этим объектам буквы локального диска, спроецированного на удаленную файловую систему. Это позволяет приложениям не зависеть от имен дисков и прозрачно работать с сетью. В частности, не надо беспокоиться, что не хватит букв для подключаемых общих ресурсов. К тому же структура подключенных дисков своя у каждого пользователя, и процессы, запущенные в другом контексте, не смогут обратиться к вашим сетевым дискам.

Имена UNC имеют вид

\\сервер\ресурс\путь

Первая часть — \\сервер, начинается с двух обратных косых черт и имени удаленного сервера, на котором находится нужный файл. Вторая — ресурс, это имя общего ресурса, то есть папки в файловой системе, к которой открыт общий доступ пользователям сети. Третья часть — \путъ, обозначает путь к нужному файлу. Предположим, на сервере с именем Myserver находится папка D:\Myfiles\CoolMusic, предоставленная для общего доступа под сетевым именем Myshare, а в этой папке — файл Sample.mp3. Тогда для доступа к этому файлу с другой машины надо указать следующее UNC-имя-.

\\Myserver\Hyshare\Sample.mp3

Как видите, это способ гораздо проще, чем подключение общей папки Myshare в качестве сетевого диска.

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

На рис. 2-1 изображены основные компоненты, формирующие UNC-co- единение в NOS в рамках Windows, а также показано, как перемещаются данные между компонентами клиента и сервера NOS.

Поставщик нескольких UNC

MUP — указатель ресурса, ответственный за выбор компонента доступа для обслуживания соединений по UNC-именам. Компонент сетевого доступа, или сетевой поставщик (network provider) — это служба, способная использовать сетевые устройства для доступа к ресурсам, расположенным на удаленном компьютере, например, к файлам и принтерам. MUP использует компонент сетевого доступа для организации связи в ответ на все запросы вво- Да-вывода к файлам и принтерам по UNC-именам.

В Windows NT, Windows 2000, Windows 95 и Windows 98 может быть несколько компонентов доступа одновременно. Так, в платформы Windows встроен клиент для сетей Microsoft (Client for Microsoft Networks), но можно также установить сторонние компоненты доступа, например, клиент для сетей Novell (Novell Client v3.01 for Windows 95/98). Таким образом, обслужить UNC-запрос могут несколько компонентов одновременно. С другой

56

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

стороны, в Windows СЕ имеется только один поставщик — клиент для сетей Microsoft.

клиент

Приложение

;

MUP

t

j Перенаправитель |

Компонент доступа

>

>

Транспортные драйверы

>

Сетевой адаптер

Сервер

Локальный ввод-вывод

Серверная служба перенаправителя

Транспортныедрайверы

>

Сетевой адаптер

Рис. 2-1. Компоненты перенаправителя

Главная функция MUP — выбор сетевого компонента, который должен обслужить UNC-запрос. MUP делает это, параллельно посылая UNC-имена из запроса всем установленным компонентам доступа. Если какой-либо компонент отвечает, что способен обслужить запрос с данными именами, то ему направляется весь запрос. Если это могут сделать несколько компонентов, то MUP выбирает тот, у которого наивысший приоритет. Приоритет компонентов определяется порядком, в котором они были установлены в системе. В Windows NT, Windows 2000, Windows 95 и Windows 98 этот приоритет определяет параметр ProviderOrder в реестре Windows в разделе \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\NetworkProvider\Order.

Установленные компоненты перечислены в порядке приоритета. Поскольку в Windows СЕ только один компонент доступа, MUP не используется, и UNC-запросы передаются сразу этому компоненту.

Компоненты сетевого доступа

Напомним, что компонент сетевого доступа — это служба, использующая сетевые устройства для доступа к файлам и принтерам на удаленном компьютере, сердцевина NOS. Компонент доступа может, например, перенаправить идентификатор локального диска (например, Е:) на общую папку на удаленном компьютере. Компоненты доступа должны также обслуживать запросы

Г Л А ВА 2 Перенаправитель

57

на соединение по UNC-именам. В Windows они используют для этого перенаправитель.

В комплект Windows входит клиент для сетей Microsoft (Client for Microsoft Networks), ранее называвшийся Microsoft Networking Provider (MSNP), который обеспечивает связь между Windows NT 4, Windows 2000, Windows 95, Windows 98 и Windows СЕ. Последняя, однако, не поддерживает установку нескольких клиентов сети одновременно и имеет встроенную поддержку лишь для клиента MSNP.

Перенаправитель

Этот компонент ОС использует для приема и обработки запросов ввода-вы- вода: перенаправитель формирует запросы и отправляет их серверной службе на удаленном компьютере, которая генерирует локальные запросы вво- да-вывода. Поскольку перенаправитель предоставляет средства ввода-выво- да службам верхнего уровня (типа MUP), он скрывает детали сетевого уровня от приложений. Поэтому приложения не должны предавать перенаправителю параметры, связанные с протоколами. В итоге компонент сетевого доступа не зависит от протокола: приложения могут работать практически в любой сетевой конфигурации.

MNSP содержит перенаправитель, напрямую взаимодействующий с уровнем сетевого транспорта, и NetBIOS для обеспечения связи между клиентом и сервером. NetBIOS API (см. главу 1), предоставляет интерфейс программирования этих транспортов. Перенаправитель MNSP часто называют перенаправителем диспетчера ЛВС (LAN Manager), поскольку он разрабатывался на основе старого диспетчера ЛВС Microsoft, обеспечивавшего работу в сети приложениям MS-DOS. Интерфейс NetBIOS позволяет установить связь по самым разным протоколам, что делает перенаправитель MNSP протоколонезависимым. Приложениям, которые его используют, не нужно знать детали работы сетевых протоколов: они выполняются поверх TCP/IP, NetBEUI или даже IPX/SPX. Это замечательная возможность позволяет приложениям обмениваться информацией, независимо от физической организации сети. Впрочем, есть один нюанс: чтобы два приложения могли связаться по сети, их рабочие станции должны иметь хотя бы один общий протокол. Так, если на компьютере А установлен только TCP/IP, а на компьютере В — только IPX, перенаправитель MSNP не сможет обеспечить связь между ними.

Перенаправитель MSNP связывается с другими рабочими станциями, посылая сообщения серверной службе перенаправителя на этих станциях. Эти сообщения задают строго в определенной структуре, называемой Server Message Block (SMB). Протокол, по которому перенаправитель фактически отправляет и получает сообщения с удаленных компьютеров, называется Server Message Block File Sharing Protocol (протокол совместного использования файлов на основе блоков сообщений сервера) или просто SMB.

ПротоколSMB

Этот протокол был разработан Microsoft и Intel в конце 80-х гг. для упрощения доступа приложений MS-DOS к удаленным файловым системам. Теперь