Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Локальные сети персональных компьютеров. Использование протоколов IPX, SPX, NETBIOS

© Александр Фролов, Григорий Фролов
Том 4, М.: Диалог-МИФИ, 1993, 160 стр.

[Назад] [Содеожание] [Дальше]

4.3. Команды NETBIOS

Перед выполнением команды ее код должен быть записан в поле Cmd блока NCB. Каждая команда NETBIOS реализована в двух вариантах - с ожиданием и без ожидания.

Если вашей программе нечего делать до тех пор, пока выполнение команды NETBIOS не будет полностью завершено, вы можете выбрать вариант с ожиданием. В этом случае после вызова NETBIOS программа вновь получит управление только после завершения выполнения команды. При использовании протоколов IPX/SPX ваша программа должна была сама дожидаться выполнения
вызванной функции, выполняя в цикле опрос поля InUse блока ECB. Однако учтите, что, если по каким-либо причинам выполнение команды не может быть завершено, ваша программа "зависнет".

Вариант без ожидания похож на вариант использования функций IPX/SPX с программой ESR, вызываемой после завершения операции. Программа, вызвавшая команду NETBIOS без ожидания, получает управление немедленно. Команда будет выполняться в фоновом режиме параллельно с работой вызвавшей ее программы. После того как выполнение команды будет завершено, управление будет передано функции, адрес которой необходимо указать в поле PostRoutine блока NCB. Можно также дожидаться окончания выполнения команды, опрашивая в цикле поле FinalCCode, которое будет содержать значение 0xFF до тех пор, пока команда не будет выполнена.

Все команды NETBIOS можно разделить на несколько групп:

для работы с именами;

  • для приема и передачи датаграмм;
  • для работы с каналами;
  • для приема и передачи данных через каналы;
  • другие команды.

Так как большинство команд NETBIOS реализованы в двух вариантах
(с ожиданием и без ожидания), для обозначения варианта с ожиданием мы будем в названии команды после префикса NB_ (от слова NETBIOS) добавлять букву W (от слова wait - ожидание). Например, команда NB_AddName выполняется без ожидания, а команда NB_WAddName - с ожиданием.

У команд без ожидания старший бит кода команды установлен в единицу.

4.3.1. Работа с именами

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

NB_WAddName (0x30)

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

Если длина имени меньше 16 байт, оно должно быть дополнено справа символами пробела. Можно закрыть имя двоичным нулем для совместимости со строками языка Си. Нуль должен находиться в последней позиции имени.

После успешного выполнения команды NETBIOS присваивает имени номер и возвращает его в поле LocalSessionNumber блока NCB. Номер имени может потребоваться вам для работы с датаграммами.

В процессе добавления имени NETBIOS посылает по сети запрос. Если такое имя уже используется на какой-либо станции, эта станция пришлет ответ.
В этом случае команда завершиться с ошибкой и имя добавлено не будет.

Процедура добавления имени занимает достаточно много времени. Это связано с необходимостью выполнить опрос всех станций сети. Поэтому вы должны добавлять имена один раз в самом начале работы программы.

Поля NCB на входе Содержимое
Cmd 0x30
OurName Добавляемое имя
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
NetworkNameNumber Присвоенный номер имени
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x09 Нет доступных ресурсов
0x0D Указанное команде имя уже используется на этой станции
0x0E Переполнение таблицы имен
0x15 Неправильное имя
0x16 Имя уже используется на одной из рабочих станций в сети
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_AddName (0xB0)

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

NB_WAddGroupName (0x36)

Команда добавляет указанное в поле OurName групповое имя в таблицу имен, расположенную на рабочей станции.

Имя не должно использоваться другими станциями в сети как обычное. Однако несколько станций могут использовать одно и тоже имя как групповое.

Если длина имени меньше 16 байт, оно должно быть дополнено справа символами пробела. Можно закрыть имя двоичным нулем для совместимости со строками языка Си. Нуль должен находиться в последней позиции имени.

После успешного выполнения команды NETBIOS присваивает имени номер и возвращает его в поле LocalSessionNumber блока NCB. Номер имени нужен для работы с датаграммами.

Поля NCB на входе Содержимое
Cmd 0x36
OurName Добавляемое групповое имя
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
NetworkNameNumber Присвоенный номер имени
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x09 Нет доступных ресурсов
0x0D Указанное команде имя уже используется на этой станции
0x0E Переполнение таблицы имен
0x15 Неправильное имя
0x16 Имя уже используется на одной из рабочих станций
в сети
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_AddGroupName (0xB6)

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

NB_WDeleteName (0x31)

Команда удаляет имя из таблицы имен рабочей станции, если оно не используется каким-либо каналом. Если же имя используется каналом, то оно помечается как назначенное для удаления и удаляется после закрытия канала.

Если вы попытаетесь удалить имя, которое используется каналом, команда завершится с кодом ошибки 0xF. В этом случае перед удалением имени необходимо закрыть канал (см. дальше описание команд для работы с каналами). Как только канал будет закрыт, связанное с ним имя будет автоматически удалено, если перед закрытием канала выполнялась попытка удалить имя.

Если имя используется несколькими каналами, его можно удалить только после закрытия всех связанных с ним каналов.

Поля NCB на входе Содержимое
Cmd 0x31
OurName Удаляемое имя
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x0F Имя используется каналом. Немедленное удаление имени невозможно, однако оно отмечено как назначенное для удаления и будет удалено после закрытия канала
0x15 Неправильное имя
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_DeleteName (0xB1)

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

4.3.2. Прием и передача датаграмм

С помощью команд приема и передачи датаграмм вы можете передавать и принимать пакеты без подтверждения, аналогично тому, как это выполняет протокол IPX.

Есть команды для передачи и приема датаграмм по обычному или групповому имени, а также для передачи и приема датаграмм, адресованных одновременно всем станциям в сети.

В отличие от протокола IPX протокол NETBIOS использует разные команды для приема обычных датаграмм и датаграмм, адресованных всем станциям в сети.

Протокол IPX не позволяет вам передавать пакет группе станций в сети. Вы можете передать пакет либо какой-либо одной станции, либо всем станциям сразу. С помощью NETBIOS вы можете организовать передачу данных так, что пакеты будут приниматься только одной группой станций в сети по ее групповому имени.

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

NB_WSendDatagram (0x20)

Команда предназначена для передачи блока данных размером от 1 до 512 байт в виде датаграммы (без подтверждения приема). Датаграмма может быть послана на обычное или групповое имя.

Для передачи датаграммы вам не надо создавать канал с принимающей станцией.

Поля NCB на входе Содержимое
Cmd 0x20
NetworkNameNumber Номер, присвоенный при добавлении имени
CallName Имя станции, которой передаются данные
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x01 Неправильная длина буфера
0x03 Неправильный код команды
0x13 Неправильный номер имени
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_SendDatagram (0xA0)

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

NB_WSendBroadcastDatagram (0x22)

Команда посылает датаграмму, которую примут все станции, выдавшие команду NB_ReceiveBroadcastDatagram (в том числе и передающая станция, если она тоже выдала команду NB_ReceiveBroadcastDatagram).

Если на одной станции команда NB_ReceiveBroadcastDatagram выдана несколько раз, все буферы после приема данных будут содержать одну и ту же информацию.

Заметим, что датаграммы, посылаемые этой командой одновременно всем станциям, могут быть приняты только теми станциями, которые выдали команду NB_ReceiveBroadcastDatagram. Поэтому если станция желает принимать датаграммы, передаваемые в "широковещательном" режиме, она должна специально к этому подготовиться. В протоколе IPX (в отличие от протокола NETBIOS) существует одна универсальная функция, которая может принимать и обычные, и "широковещательные" датаграммы.

Поля NCB на входе Содержимое
Cmd 0x22
NetworkNameNumber Номер, присвоенный при добавлении имени
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x01 Неправильная длина буфера
0x03 Неправильный код команды
0x13 Неправильный номер имени
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_SendBroadcastDatagram (0xA2)

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

NB_WReceiveDatagram (0x21)

Команда предназначена для приема датаграмм, переданных командой NB_SendDatagram. Она не может принимать датаграммы, переданные в "широковещательном" режиме командой NB_SendBroadcastDatagram. Однако эта команда может принимать датаграммы, посланные на групповое имя.

Если перед вызовом команды в поле NetworkNameNumber блока NCB записать значение 0xFF, команда сможет принимать датаграммы от любой станции для любого имени.

Если длина принятой датаграммы превышает значение, указанное в поле Size, принятый блок данных будет обрезан.

Поля NCB на входе Содержимое
Cmd 0x21
NetworkNameNumber Номер, присвоенный при добавлении имени или 0xFF
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CallName Имя станции, от которой получена датаграмма
Size Размер принятого блока данных
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x01 Неправильная длина буфера
0x03 Неправильный код команды
0x06 Размер буфера слишком мал для того, чтобы разместить в нем принятые данные
0x0B Команда отменена
0x13 Неправильный номер имени
0x17 Имя удалено
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_ReceiveDatagram (0xA1)

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

NB_WReceiveBroadcastDatagram (0x23)

Команда предназначена для приема датаграмм, переданных командой NB_SendBroadcastDatagram. Она не может принимать датаграммы, переданные командой NB_SendDatagram.

Если перед вызовом команды в поле NetworkNameNumber блока NCB записать значение 0xFF, команда сможет принимать датаграммы от любой станции для любого имени.

Если длина принятой датаграммы превышает значение, указанное в поле Size, принятый блок данных будет обрезан.

Поля NCB на входе Содержимое
Cmd 0x23
NetworkNameNumber Номер, присвоенный при добавлении имени или 0xFF
Buffer Адрес буфера, содержащего передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CallName Имя станции, от которой получена датаграмма
Size Размер принятого блока данных
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x01 Неправильная длина буфера
0x03 Неправильный код команды
0x06 Размер буфера слишком мал для того, чтобы разместить в нем принятые данные
0x0B Команда отменена
0x13 Неправильный номер имени
0x17 Имя удалено
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_ReceiveBroadcastDatagram (0xA3)

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

4.3.3. Работа с каналами

В группе команд, предназначенных для работы с каналами, есть команды для создания канала, команды для удаления канала, а также команда для определения состояния канала.

Канал создается одновременно двумя станциями, одна из которых при этом находится в режиме приема запроса на создание канала, а другая передает такой запрос.

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

Можно создать канал с самим собой, если при создании канала указать в качестве имени партнера свое имя.

NB_WCall (0x10)

Команда устанавливает канал между двумя именами, заданными в блоке NCB. Эти имена могут относиться к программам, работающим на разных станциях или на одной станции. В поле OurName указывается имя станции, которая устанавливает канал, в поле CallName - имя станции, с которой устанавливается канал.

Для успешного создания канала принимающая сторона должна выдать команду NB_Listen, которая будет описана ниже.

Можно установить канал не только с обычным, но и с групповым именем. Для этого придется выдать команду NB_WCall несколько раз, так как за один вызов создается только один канал.

Команда NB_WCall делает несколько попыток создать канал и в случае
неудачи возвращает код ошибки.

При создании канала указывается время тайм-аута для операций приема и передачи данных. Если команды приема или передачи данных через каналы не будут выполнены в течение времени тайм-аута, они (команды) будут прерваны. При этом считается, что канал неработоспособен.

После создания канала поле LocalSessionNumber будет содержать присвоенный номер канала. Сохраните его для использования в процессе приема и передачи данных по каналу.

Поля NCB на входе Содержимое
Cmd 0x10
CallName Имя, с которым устанавливается канал
OurName Имя станции, создающей канал
ReceiveTimeout Время ожидания приема, в 1/2 с
SendTimeout Время ожидания передачи, в 1/2 с
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
LocalSessionNumber Присвоенный номер канала
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x09 Нет доступных ресурсов
0x15 Неправильное имя
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x09 Нет доступных ресурсов
0x0B Команда отменена
0x11 Переполнилась таблица каналов
0x12 Создание канала отвергнуто
0x14 Нет ответа от станции с указанным именем или в сети нет такого имени
0x15 Неправильное имя
0x18 Ненормальное закрытие канала
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_Call (0x90)

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

NB_WListen (0x11)

Команда работает в паре с предыдущей командой и предназначена для организации канала с вызываемой стороны.

В поле CallName блока NCB необходимо указать имя, с которым устанавливается канал. Если в первый байт имени записать символ "*", канал будет установлен с любой вызывающей станцией.

Программа может выдать несколько команд NB_Listen для создания одно-
временно нескольких каналов.

В случае успешного завершения команда запишет в поле LocalSessionNumber номер созданного канала.

При создании канала необходимо указать время тайм-аута для операций приема и передачи данных через канал. Сама команда NB_WListen не использует тайм-аут. Программа, выдавшая эту команду, будет находиться в состоянии ожидания до тех пор, пока какая-либо станция не пожелает создать с ней канал. Для исключения состояния "зависания" программы лучше использовать вариант NB_Listen этой команды (без ожидания).

Поля NCB на входе Содержимое
Cmd 0x11
CallName Имя, с которым устанавливается канал. Если в первый байт имени записать символ "*", канал будет установлен с любой вызывающей станцией
OurName Имя станции, создающей канал с принимающей стороны
ReceiveTimeout Время ожидания приема, в 1/2 с
SendTimeout Время ожидания передачи, в 1/2 с
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
   

Поля NCB на выходе Содержимое
LocalSessionNumber Присвоенный номер канала
CallName В это поле записывается имя вызвавшей станции, если при установлении канала было указано имя "*"
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x09 Нет доступных ресурсов
0x15 Неправильное имя
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x09 Нет доступных ресурсов
0x0B Команда отменена
0x11 Переполнилась таблица каналов
0x15 Неправильное имя
0x17 Указанное имя было удалено
0x18 Ненормальное закрытие канала
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_Listen (0x91)

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

NB_WHangUp (0x12)

Команда предназначена для закрытия канала, номер которого указан в поле LocalSessionNumber блока NCB. Она должна быть выполнена с обеих сторон канала после завершения работы.

Если для закрываемого с помощью этой команды канала на других станциях выдана команда NB_WReceive, она завершается с кодом ощибки 0x0A. Выданная для закрываемого канала команда NB_WSend также завершается с кодом 0x0A, но через 20 секунд, которые отводятся ей для завершения своей работы. Если команда NB_WSend не успела завершить передачу за 20 секунд, команда NB_WHangUp завершается с кодом 0x05.

Аналогично с кодом 0x0A завершает свою работу и команда NB_WReceiveAny, выданная для закрываемого канала.

Другие команды, выданные для закрываемого канала, завершаются с кодом 0x18.

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

Поля NCB на входе Содержимое
Cmd 0x12
LocalSessionNumber Номер закрываемого канала
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x08 Неправильный номер канала
0x0A Канал уже закрыт
0x0B Команда отменена
0x18 Ненормальное закрытие канала
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_HangUp (0x92)

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

NB_WSessionStatus (0x34)

Команда возвращает программе состояние канала, имя которого указано в поле OurName блока NCB. В качестве имени можно указать символ "*", в этом случае программа получит информацию о каналах, относящихся ко всем именам станций, имеющихся в локальной таблице имен на вызывающей команду станции.

Информация о состоянии каналов возвращается в буфер, адрес которого программа должна записать в поле Buffer блока NCB. Размер буфера должен быть указан в поле Size блока NCB.

Формат буфера можно описать следующей структурой:

struct _SESSION_STATUS {
        unsigned char NameNumber;
        unsigned char SessionCount;
        unsigned char DatagramsOutstanding;
        unsigned char ReceiveAnyoutstanding;
        struct _SESSION {
                unsigned char LocalSessionNumber;
                unsigned char State;
                char LocalName[16];
                char RemoteName[16];
                unsigned char ReceiveCount;
                unsigned char SendCount;
        } Session[40];
};

Приведем список полей буфера:

Название поля Назначение поля
NameNumber Номер имени канала
SessionCount Количество каналов
DatagramsOutstanding Количество выданных команд на прием датаграмм
ReceiveAnyoutstanding Количество выданных команд на прием командой NB_ReceiveAny
Session Массив структур, описывающих каждый канал в отдельности
LocalSessionNumber Номер канала
State Состояние канала:
1 - ожидание завершения команды NB_Listen;
2 - ожидание завершения команды NB_Call;
3 - канал установлен;
4 - ожидание завершения команды NB_HangUp;
5 - команда NB_HangUp завершила свое вы- полнение;
6 - канал закрыт с ошибкой.
LocalName Имя локальной станции
RemoteName Имя удаленной станции
ReceiveCount Количество ожидающих завершение команд NB_Receive
SendCount Количество ожидающих завершения команд NB_Send
Поля NCB на входе Содержимое
Cmd 0x34
Buffer Дальний адрес буфера для приема информации
о состоянии каналов
Size Размер буфера
OurNames Имя канала, для которого необходимо получить информацию о состоянии. В качестве имени можно указывать "*"
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
Size Размер заполненной части буфера
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x15 Неправильное имя
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x01 Неправильная длина буфера
0x03 Неправильный код команды
0x06 Слишком мал размер выделенного буфера
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_SessionStatus (0xB4)

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

4.3.4. Прием и передача данных через каналы

NB_WSend (0x14)

С помощью этой команды программа может передать блок данных размером от 1 до 65535 байт по созданному ранее каналу. Перед вызовом команды программа должна записать номер канала, по которому будет выполняться передача, в поле LocalSessionNumber блока NCB. Адрес передаваемого блока данных и его длина должны быть записаны в поля Buffer и Size.

Для приема данных, передаваемых командой NB_WSend, необходимо использовать команду NB_WReceive (или NB_Receive).

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

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

Поля NCB на входе Содержимое
Cmd 0x14
LocalSessionNumber Номер используемого канала
Buffer Указатель на буфер, содержащий передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x08 Неправильный номер канала
0x0A Канал закрыт
0x0B Команда отменена
0x18 Ненормальное закрытие канала
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_Send (0x94)

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

NB_WSendNoAck (0x71)

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

Поля NCB на входе Содержимое
Cmd 0x71
LocalSessionNumber Номер используемого канала
Buffer Указатель на буфер, содержащий передаваемые данные
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x08 Неправильный номер канала
0x0A Канал закрыт
0x0B Команда отменена
0x18 Ненормальное закрытие канала
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_SendNoAck (0xF1)

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

NB_WChainSend (0x17)

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

Первый буфер задается, как и для команды NB_WSend, через поля Buffer и Size. Размер второго буфера должен быть записан в первые два байта поля CallName блока ECB, а его адрес занимает следующие четыре байта этого поля.

Поля NCB на входе Содержимое
Cmd 0x17
LocalSessionNumber Номер используемого канала
Buffer Указатель на первый буфер, содержащий передаваемые данные
Size Размер первого буфера
CallName Первые два байта содержат размер второго буфера, следующие четыре байта - дальний адрес второго буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x08 Неправильный номер канала
0x0A Канал закрыт
0x0B Команда отменена
0x18 Ненормальное закрытие канала
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_ChainSend (0x97)

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

NB_WChainSendNoAck (0x72)

Команда аналогична команде NB_WCainSend, однако в отличие от нее не выполняет проверку доставки блока данных принимающей стороне. За счет этого она работает немного быстрее.

Поля NCB на входе Содержимое
Cmd 0x72
LocalSessionNumber Номер используемого канала
Buffer Указатель на первый буфер, содержащий передаваемые данные
Size Размер первого буфера
CallName Первые два байта содержат размер второго буфера, следующие четыре байта - дальний адрес второго буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x08 Неправильный номер канала
0x0A Канал закрыт
0x0B Команда отменена
0x18 Ненормальное закрытие канала
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_ChainSendNoAck (0xF2)

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

NB_WReceive (0x15)

Команда принимает данные, посланные командами NB_WSend или NB_WChainSend.

Если размер буфера недостаточен для записи принятых данных, команда возвращает код ошибки 0x06; в этом случае вы можете вызвать команду еще раз для того, чтобы прочесть данные, не поместившиеся в буфере при предыдущем вызове команды.

Поля NCB на входе Содержимое
Cmd 0x15
LocalSessionNumber Номер используемого канала
Buffer Указатель на буфер, используемый для записи принятых данных
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
Size Количество принятых и записанных в буфер байт данных
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x05 Истекло время ожидания
0x06 Размер буфера недостаточен для записи принятых данных
0x08 Неправильный номер канала
0x0A Канал закрыт
0x0B Команда отменена
0x18 Ненормальное закрытие канала
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_Receive (0x95)

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

NB_WReceiveAny (0x16)

Команда принимает данные от всех партнеров. Для этой команды вместо номера канала необходимо указать номер имени, полученный вашей программой при добавлении имени. Если в поле NetworkNameNumber проставить значение 0xFF, эта команда будет принимать данные от любых партнеров для любых каналов, созданных на вашей станции.

Если размер буфера недостаточен для записи принятых данных, команда возвращает код ошибки 0x06; в этом случае вы можете вызвать команду еще раз для того, чтобы прочесть данные, не поместившиеся в буфере при предыдущем вызове команды.

Поля NCB на входе Содержимое
Cmd 0x16
NetworkNameNumber Номер имени или 0xFF
Buffer Указатель на буфер, используемый для записи принятых данных
Size Размер буфера
PostRoutine Дальний указатель на POST-программу или нулевое значение, если POST-программа не используется
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
Size Количество принятых и записанных в буфер байт данных
NetworkNameNumber Номер имени станции, от которой пришли данные
CCode Промежуточный код завершения команды
FinalCCode Окончательный код завершения команды
Содержимое поля CCode
на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x06 Размер буфера недостаточен для записи принятых данных
0x08 Неправильный номер канала
0x0A Канал закрыт
0x0B Команда отменена
0x13 Неправильный номер имени
0x17 Указанное имя было удалено
0x18 Ненормальное закрытие канала
0x19 Конфликт имен (внутренняя ошибка NETBIOS)
0x21 Интерфейс занят
0x22 Выдано слишком много команд
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_ReceiveAny (0x96)

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

4.3.5. Другие команды

В этом разделе мы опишем команды NETBIOS, позволяющие сбросить драйвер NETBIOS в исходное состояние, отменить выданную ранее команду.

NB_WResetAdapter (0x32)

Команда сбрасывает NETBIOS в исходное состояние, удаляет все имеющиеся каналы и имена (кроме постоянного имени, которое нельзя удалить, не вытащив сетевой адаптер из компьютера). С помощью этой команды можно также изменить максимальное количество доступных программе каналов и используемых одновременно блоков NCB. По умолчанию доступны шесть каналов и 12 блоков NCB.

Поля NCB на входе Содержимое
Cmd 0x32
LocalSessionNumber Максимальное количество каналов или 0 для использования значения по умолчанию
NetworkNameNumber Максимальное количество блоков NCB или 0 для использования значения по умолчанию
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
FinalCCode Окончательный код завершения команды
Содержимое поля CCode на выходе Не используется
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения

NB_WCancel (0x35)

Команда используется для отмены других запущенных команд. Адрес NCB для отменяемой команды должен быть записан в поле Buffer.

С помощью этой команды нельзя отменить следующие команды: NB_AddName, NB_AddGroupName, NB_DeleteName, NB_SendDatagramm, NB_SendBroadcastDatagramm, NB_ResetAdapter, NB_SessionStatus, NB_Cancel, NB_Unlink.

Поля NCB на входе Содержимое
Cmd 0x35
Buffer Указатель на блок NCB, для которого отменяется команда
AdapterNumber Номер адаптера; 0 - первый адаптер, 1 - второй
Поля NCB на выходе Содержимое
FinalCCode Окончательный код завершения команды
Содержимое поля
CCode на выходе
Не используется
Содержимое поля
FinalCCode на выходе
Значение
0x00 Нет ошибок
0x03 Неправильный код команды
0x23 Неправильное значение в поле номера адаптера AdapterNumber
0x24 Команда уже начала выполняться, когда пришел запрос на ее отмену
0x26 Данную команду нельзя отменить
0x40 - 0x4F Необычное состояние сети (Unusual network condition)
0x50 - 0xFE Сбой сетевого адаптера или другого сетевого аппаратного обеспечения
[Назад] [Содеожание] [Дальше]