Поделиться через


Структура NCB (nb30.h)

[Netbios не поддерживается в Windows Vista, Windows Server 2008 и последующих версиях операционной системы]

Структура NCB представляет блок управления сетью. Он содержит сведения о выполняемой команде, необязательную подпрограмму post, необязательный дескриптор событий и указатель на буфер, используемый для сообщений или других данных. Указатель на эту структуру передается в функцию Netbios .

Синтаксис

typedef struct _NCB {
  UCHAR  ncb_command;
  UCHAR  ncb_retcode;
  UCHAR  ncb_lsn;
  UCHAR  ncb_num;
  PUCHAR ncb_buffer;
  WORD   ncb_length;
  UCHAR  ncb_callname[NCBNAMSZ];
  UCHAR  ncb_name[NCBNAMSZ];
  UCHAR  ncb_rto;
  UCHAR  ncb_sto;
  void()(_NCB *)  * ncb_post;
  UCHAR  ncb_lana_num;
  UCHAR  ncb_cmd_cplt;
#if ...
  UCHAR  ncb_reserve[18];
#else
  UCHAR  ncb_reserve[10];
#endif
  HANDLE ncb_event;
} NCB, *PNCB;

Члены

ncb_command

Указывает код команды и флаг, указывающий, обрабатывается ли структура NCB асинхронно. Самый значимый бит содержит флаг . Если константа ASYNCH объединяется с командным кодом (с помощью оператора OR), структура NCB обрабатывается асинхронно. Поддерживаются следующие коды команд.

Код Значение
NCBACTION

Windows Server 2003, Windows XP, Windows 2000 и Windows NT: включает расширения для транспортного интерфейса. NCBACTION сопоставляется с TdiAction. Если указан этот код, элемент ncb_buffer указывает на буфер, заполняемый ACTION_HEADER структурой, за которой при необходимости следуют данные. Команды NCBACTION нельзя отменить с помощью NCBCANCEL. NCBACTION не является стандартной командой NetBIOS 3.0.

NCBADDGRNAME Добавляет имя группы в локальную таблицу имен. Это имя не может использоваться другим процессом в сети в качестве уникального имени, но его может добавить любой пользователь в качестве имени группы.
NCBADDNAME Добавляет уникальное имя в локальную таблицу имен. Драйвер TDI гарантирует уникальность имени в сети.
NCBASTAT Извлекает состояние локального или удаленного адаптера. При указании этого кода элемент ncb_buffer указывает на буфер, заполняемый ADAPTER_STATUS структурой, за которой следует массив NAME_BUFFER структур.
NCBCALL Открывает сеанс с другим именем.
NCBCANCEL Отменяет предыдущую ожидающие команды.
NCBCHAINSEND Отправляет содержимое двух буферов данных указанному партнеру по сеансу.
NCBCHAINSENDNA Отправляет содержимое двух буферов данных указанному партнеру по сеансу и не ожидает подтверждения.
NCBDELNAME Удаляет имя из локальной таблицы имен.
NCBDGRECV Получает датаграмму из любого имени.
NCBDGRECVBC Получает широковещательную датаграмму из любого имени.
NCBDGSEND Отправляет датаграмму на указанное имя.
NCBDGSENDBC Отправляет широковещательную датаграмму на каждый узел в локальной сети .
NCBENUM

Windows Server 2003, Windows XP, Windows 2000 и Windows NT: перечисление номеров адаптера LAN (LANA). Если указан этот код, элемент ncb_buffer указывает на буфер, заполняемый LANA_ENUM структурой. NCBENUM не является стандартной командой NetBIOS 3.0.

NCBFINDNAME Определяет расположение имени в сети. При указании этого кода элемент ncb_buffer указывает на буфер, заполняемый FIND_NAME_HEADER структурой, за которой следует одна или несколько FIND_NAME_BUFFER структур.
NCBHANGUP Закрывает указанный сеанс.
NCBLANSTALERT

Windows Server 2003, Windows XP, Windows 2000 и Windows NT. Уведомляет пользователя о сбоях локальной сети, которые длятся более одной минуты.

NCBLISTEN Позволяет открывать сеанс с другим именем (локальным или удаленным).
NCBRECV Получает данные от указанного партнера по сеансу.
NCBRECVANY Получает данные из любого сеанса, соответствующего указанному имени.
NCBRESET Сбрасывает адаптер локальной сети. Адаптер должен быть сброшен, прежде чем он сможет принять любую другую команду NCB, которая указывает то же число в элементе ncb_lana_num .

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

  • Если ncb_lsn не 0x00, все ресурсы, связанные с ncb_lana_num , должны быть освобождены.
  • Если ncb_lsn 0x00, все ресурсы, связанные с ncb_lana_num , должны быть освобождены и выделены новые ресурсы. Байт ncb_callname[0] указывает максимальное число сеансов, а байт ncb_callname[2] — максимальное число имен. Ненулевое значение для ncb_callname[3] байт-запросов, которые приложение использует NAME_NUMBER_1.
NCBSEND Отправляет данные указанному партнеру по сеансу.
NCBSENDNA Отправляет данные указанному партнеру по сеансу и не ожидает подтверждения.
NCBSSTAT Извлекает состояние сеанса. При указании этого значения элемент ncb_buffer указывает на буфер, заполняемый SESSION_HEADER структурой, за которой следует одна или несколько SESSION_BUFFER структур.
NCBTRACE Активирует или отключает трассировку NCB.

Эта команда не поддерживается.

NCBUNLINK Отменяет связь адаптера.

Эта команда предоставляется для совместимости с более ранними версиями NetBIOS. Он не действует в Windows.

ncb_retcode

Указывает код возврата. Это значение равно NRC_PENDING во время выполнения асинхронной операции. Система возвращает одно из следующих значений:

Значение Значение
NRC_GOODRET Операция успешно выполнена.
NRC_BUFLEN Указана недопустимая длина буфера.
NRC_ILLCMD Была передана недопустимая команда.
NRC_CMDTMO Истекло время ожидания команды.
NRC_INCOMP Сообщение было неполным. Приложение выполняет другую команду.
NRC_BADDR Адрес буфера был незаконным.
NRC_SNUMOUT Номер сеанса вышел за пределы диапазона.
NRC_NORES Ресурс недоступен.
NRC_SCLOSED Сеанс был закрыт.
NRC_CMDCAN Команда была отменена.
NRC_DUPNAME В локальной таблице имен существует повторяющееся имя.
NRC_NAMTFUL Таблица имен заполнена.
NRC_ACTSES Команда завершена; имя содержит активные сеансы и больше не зарегистрировано.
NRC_LOCTFUL Таблица локальных сеансов заполнена.
NRC_REMTFUL Таблица удаленных сеансов заполнена. Запрос на открытие сеанса был отклонен.
NRC_ILLNN Указан недопустимый номер имени.
NRC_NOCALL Система не обнаружила имя, которое было вызвано.
NRC_NOWILD Подстановочные знаки не допускаются в элементе ncb_name .
NRC_INUSE Имя уже использовалось на удаленном адаптере.
NRC_NAMERR Имя удалено.
NRC_SABORT Сеанс завершился ненормально.
NRC_NAMCONF Обнаружен конфликт имен.
NRC_IFBUSY Интерфейс был занят.
NRC_TOOMANY Слишком много команд было невыполненным; приложение может повторить команду позже.
NRC_BRIDGE Член ncb_lana_num не указал допустимый номер сети.
NRC_CANOCCR Команда завершена во время выполнения операции отмены.
NRC_CANCEL Недопустимая команда NCBCANCEL; команда не была отменена.
NRC_DUPENV Имя было определено другим локальным процессом.
NRC_ENVNOTDEF Среда не определена. Должна быть выдана команда сброса.
NRC_OSRESNOTAV Ресурсы операционной системы исчерпаны. Приложение может повторить команду позже.
NRC_MAXAPPS Превышено максимальное число приложений.
NRC_NOSAPS Для NetBIOS не были доступны точки доступа к службам .NetBIOS.
NRC_NORESOURCES Запрошенные ресурсы были недоступны.
NRC_INVADDRESS Недопустимый адрес NCB.
NRC_INVDDID Недопустимый идентификатор DDID NCB.

Этот код возврата не является частью спецификации IBM NetBIOS 3.0 и не возвращается в структуре NCB . Вместо этого он возвращается функцией Netbios .

NRC_LOCKFAIL Попытка заблокировать область пользователя завершилась сбоем.
NRC_OPENERR Ошибка во время операции открытия, выполняемой драйвером устройства. Этот код ошибки не входит в спецификацию NetBIOS 3.0.
NRC_SYSTEM Произошла системная ошибка.
NRC_PENDING Асинхронная операция еще не завершена.

ncb_lsn

Определяет номер локального сеанса. Это число однозначно идентифицирует сеанс в среде. Это число возвращается функцией Netbios после успешной команды NCBCALL.

ncb_num

Указывает номер имени локальной сети. Это число возвращается Netbios после успешного выполнения команды NCBADDNAME или NCBADDGRNAME . Это число, а не имя, должно использоваться со всеми командами datagram и для команд NCBRECVANY .

Число для NAME_NUMBER_1 всегда 0x01. Функция Netbios назначает значения в диапазоне 0x02 0xFE оставшимся именам.

ncb_buffer

Указатель на буфер сообщений. Буфер должен иметь доступ на запись. Его использование выглядит следующим образом:

Get-Help Назначение
NCBSEND Содержит сообщение для отправки.
NCBRECV Получает сообщение.
NCBSSTAT Получает запрошенные сведения о состоянии.

ncb_length

Указывает размер (в байтах) буфера сообщений. Для команд получения этот элемент задается функцией Netbios , чтобы указать количество полученных байтов.

Если длина буфера неверна, функция Netbios возвращает код ошибки NRC_BUFLEN .

ncb_callname[NCBNAMSZ]

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

ncb_name[NCBNAMSZ]

Указывает имя, по которому известно приложение. Следует указать символы пробела в конце, чтобы длина строки была равна NCBNAMSZ.

ncb_rto

Указывает время ожидания для операций получения в 500 миллисекундах для сеанса. Значение, равное нулю, не подразумевает истечения времени ожидания. Укажите с помощью команды NCBCALL или NCBLISTEN . Влияет на последующие команды NCBRECV .

ncb_sto

Указывает время ожидания для операций отправки в 500 миллисекундах для сеанса. Значение, равное нулю, не подразумевает истечения времени ожидания. Укажите с помощью команды NCBCALL или NCBLISTEN . Влияет на последующие команды NCBSEND и NCBCHAINSEND .

ncb_post

Указывает адрес подпрограммы post, вызываемой при выполнении асинхронной команды. Подпрограмма post определяется следующим образом:

NCB_POST PostRoutine( PNCB pncb );

где параметр pncb является указателем на завершенную структуру NCB .

ncb_lana_num

Указывает номер адаптера локальной сети. Это отсчитываемое от нуля число соответствует конкретному поставщику транспорта, использующим определенную плату адаптера локальной сети.

ncb_cmd_cplt

Указывает флаг завершения команды. Это значение совпадает с ncb_retcode элементом.

ncb_reserve[18]

Защищены; значение должно быть равно нулю.

Длина X массива ncb_reserve зависит от архитектуры системы. Для 64-разрядных систем массив содержит 18 элементов. В противном случае массив содержит 10 элементов.

ncb_reserve[10]

Защищены; значение должно быть равно нулю.

Длина X массива ncb_reserve зависит от архитектуры системы. Для 64-разрядных систем массив содержит 18 элементов. В противном случае массив содержит 10 элементов.

ncb_event

Задает дескриптор для объекта события, которому присваивается состояние без знака при принятии асинхронной команды, и при завершении асинхронной команды устанавливается состояние сигнала. Событие получает сигнал, если функция Netbios возвращает ненулевое значение. Для синхронизации следует использовать только события сброса вручную. Указанное событие не должно быть связано с несколькими активными асинхронными командами.

Элемент ncb_event должен быть равен нулю, если для ncb_command элемента не установлен флаг ASYNCH или если ncb_post не равно нулю. В противном случае Netbios возвращает код ошибки NRC_ILLCMD .

Комментарии

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

Требования

Требование Значение
Минимальная версия клиента Windows 2000 Professional [только классические приложения]
Минимальная версия сервера Windows 2000 Server [только классические приложения]
Верхняя часть nb30.h

См. также раздел

ACTION_HEADER

ADAPTER_STATUS

FIND_NAME_BUFFER

FIND_NAME_HEADER

LANA_ENUM

NAME_BUFFER

Структуры NetBIOS

Netbios

SESSION_BUFFER

SESSION_HEADER

Обзор интерфейса NetBIOS