Работа с NetBIOS

Фленов Михаил

Xakep, номер #050, стр. 050-080-1


(smirnandr@mail.ru)

http://www.cydsoft.com/vr-online/

Сегодня я решил рассказать тебе о работе протокола NetBIOS и о том, как его кодить в своих программах. Он достаточно прост, потому что API протокола состоит только из одной функции Netbios. Несмотря на то, что функция одна, она умеет больше, чем любая другая функция из других сетевых библиотек. Поэтому я не смогу ее описать всю, но небольшие начальные сведения постараюсь дать.

В Windows за работу NetBIOS отвечает библиотека netapi32.dll. Это значит, что поклонникам языка С++ нужны будут заголовочные файлы и файл библиотеки netapi32.lib. Нам, дельфинам, немного проще - достаточно только заголовочного файла nb.pas. Его ты найдешь на диске к этому номеру или вместе с исходником на моем сайте.

Как я уже сказал, вся библиотека NetBIOS крутится вокруг одноименной функции, и ее объявление выглядит таким образом:

function NetbiosCmd(var NCB: TNCB): Word;

Как видишь, у нее только один параметр - структура NCB. Это довольно сложная структура, в которой и заключается вся работа. С ее помощью ты будешь говорить библиотеке, что от нее требуется, а также принимать и получать любые данные.

Всемогущий NCB

Теперь перейдем к более конкретному изучению структуры NCB. Ее описание для Windows выглядит так:

TNCB = packed record

Command: byte;

RetCode: byte;

LSN: byte;

Num: byte;

Buf: ^byte;

Length: word;

CallName: TNBName;

Name: TNBName;

RTO: byte;

STO: byte;

PostPrc: TNCBPostProc;

Lana_Num: byte;

Cmd_Cplt: byte;

Reserved: array[0..9] of byte;

Event: THandle;

end;

1) Первый параметр (command) указывает на команду, которую необходимо выполнить. Я не смогу их описать все, но могу посоветовать заглянуть в заголовочный файл и поискать константы, начинающиеся с NCB_. Все это (кроме NCB_ASYNC) и есть имена констант, указывающих на определенные команды. Константа NCB_ASYNC имеет особое значение. Если ты просто укажешь необходимую команду, то она будет выполнена синхронно. Но если ее поразрядно логически сложить (для этого вместо знака + указывают and, хотя и простое сложение тоже сработает) с константой NCB_ASYNC, то команда будет уже выполнена асинхронно.

2) Второй параметр (RetCode) содержит код результата выполнения команды. Если ты выполняешь ее асинхронно, то NetBIOS не может сразу вернуть результат. Поэтому в этом случае сюда будет помещено значение $ff или константа NRC_PENDING, означающая, что асинхронная команда еще не выполнена. Константы возвращаемых значений можно найти в заголовочном файле. Начинаются они с NRC_.

3) Параметр LSN - номер локального сеанса, который ты можешь получить после выполнения команд NCB_CALL (открыть сессию) и NCB_LISTEN (ждать вызова).

4) Num - номер сетевого имени. Такие номера получаются после вызова команд NCB_ADDNAME (добавить уникальное имя в локальную таблицу) и NCB_ADDGRPNAME (добавить имя группы в локальную таблицу).

5) Следующий параметр (Buf) - это буфер, в котором нужно размещать данные, которые необходимо отправить в сеть. Здесь также можно получить данные, принятые из сети.

Содержание  Вперед на стр. 050-080-2