NCB 结构 (nb30.h)

[Windows Vista、Windows Server 2008 和操作系统的后续版本不支持 Netbios ]

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 结构的标志。 最有效位包含 标志。 如果使用 OR 运算符) 将 ASYNCH 常量与 (命令代码组合在一起,则以异步方式处理 NCB 结构。 支持以下命令代码。

代码 含义
NCBACTION

Windows Server 2003、Windows XP、Windows 2000 和 Windows NT:启用传输接口的扩展。 NCBACTION 映射到 TdiAction。 指定此代码时, ncb_buffer 成员指向要用ACTION_HEADER结构填充 缓冲区,该结构后跟数据(可选)。 无法使用 NCBCANCEL 取消 NCBACTION 命令。 NCBACTION 不是标准 NetBIOS 3.0 命令。

NCBADDGRNAME 将组名添加到本地名称表。 网络上的其他进程不能将此名称用作唯一名称,但任何人都可以将其添加为组名。
NCBADDNAME 向本地名称表添加唯一名称。 TDI 驱动程序可确保该名称在整个网络中是唯一的。
NCBASTAT 检索本地或远程适配器的状态。 指定此代码时, ncb_buffer 成员指向要用 ADAPTER_STATUS 结构填充的缓冲区,后跟 NAME_BUFFER 结构的数组。
NCBCALL 使用另一个名称打开会话。
NCBCANCEL 取消上一个挂起的命令。
NCBCHAINSEND 将两个数据缓冲区的内容发送到指定的会话伙伴。
NCBCHAINSENDNA 将两个数据缓冲区的内容发送到指定的会话伙伴,并且不等待确认。
NCBDELNAME 从本地名称表中删除名称。
NCBDGRECV 从任何名称接收数据报。
NCBDGRECVBC 从任何名称接收广播数据报。
NCBDGSEND 将数据报发送到指定的名称。
NCBDGSENDBC 将广播数据报发送到局域网上的每个主机 (LAN) 。
NCBENUM

Windows Server 2003、Windows XP、Windows 2000 和 Windows NT: (LANA) 编号枚举 LAN 适配器。 指定此代码时,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:通知用户 LAN 故障持续时间超过一分钟。

NCBLISTEN 允许使用另一个名称打开会话, (本地或远程) 。
NCBRECV 从指定的会话伙伴接收数据。
NCBRECVANY 从与指定名称对应的任何会话接收数据。
NCBRESET 重置 LAN 适配器。 适配器必须先重置,然后才能接受在 ncb_lana_num 成员中指定相同编号的任何其他 NCB 命令。

使用以下值指定如何释放资源:

  • 如果未 0x00 ncb_lsn ,则将释放与 ncb_lana_num 关联的所有资源。
  • 如果 0x00 ncb_lsn,则将释放 与ncb_lana_num 关联的所有资源,并分配新资源。 ncb_callname[0] 字节指定最大会话数,ncb_callname[2] 字节指定最大名称数。 应用程序使用 NAME_NUMBER_1 ncb_callname[3] 字节请求 的非零值。
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 没有服务接入点 (SAP) 可用。
NRC_NORESOURCES 请求的资源不可用。
NRC_INVADDRESS NCB 地址无效。
NRC_INVDDID NCB DDID 无效。

此返回代码不是 IBM NetBIOS 3.0 规范的一部分,也不会在 NCB 结构中返回。 相反,它由 Netbios 函数返回。

NRC_LOCKFAIL 尝试锁定用户区域失败。
NRC_OPENERR 在设备驱动程序执行的打开操作期间出错。 此错误代码不属于 NetBIOS 3.0 规范。
NRC_SYSTEM 发生系统错误。
NRC_PENDING 异步操作尚未完成。

ncb_lsn

标识本地会话编号。 此数字唯一标识环境中的会话。 此数字在成功执行 NCBCALL 命令后由 Netbios 函数返回。

ncb_num

指定本地网络名称的编号。 此数字在成功执行 NCBADDNAMENCBADDGRNAME 命令后由 Netbios 返回。 此数字(而不是名称)必须用于所有数据报命令和 NCBRECVANY 命令。

NAME_NUMBER_1的编号始终0x01。 Netbios 函数将0x02范围内的值分配给剩余名称的0xFE。

ncb_buffer

指向消息缓冲区的指针。 缓冲区必须具有写入访问权限。 其用途如下:

Command 目的
NCBSEND 包含要发送的消息。
NCBRECV 接收消息。
NCBSSTAT 接收请求的状态信息。

ncb_length

指定消息缓冲区的大小(以字节为单位)。 对于接收命令,此成员由 Netbios 函数设置,以指示接收的字节数。

如果缓冲区长度不正确, Netbios 函数将返回 NRC_BUFLEN 错误代码。

ncb_callname[NCBNAMSZ]

指定远程应用程序的名称。 应提供尾随空格字符,使字符串的长度等于 NCBNAMSZ

ncb_name[NCBNAMSZ]

指定应用程序已知的名称。 应提供尾随空格字符,使字符串的长度等于 NCBNAMSZ

ncb_rto

指定会话的接收操作的超时期限(以 500 毫秒为单位)。 值为零表示没有超时。使用 NCBCALLNCBLISTEN 命令指定 。 影响后续 NCBRECV 命令。

ncb_sto

指定会话的发送操作的超时期限(以 500 毫秒为单位)。 值为零表示没有超时。使用 NCBCALLNCBLISTEN 命令指定 。 影响后续 的 NCBSENDNCBCHAINSEND 命令。

ncb_post

指定异步命令完成时要调用的 post 例程的地址。 post 例程定义为:

NCB_POST PostRoutine ( PNCB pncb ) ;

其中 pncb 参数是指向已完成 的 NCB 结构的指针。

ncb_lana_num

指定 LAN 适配器编号。 此从零开始的数字对应于使用特定 LAN 适配器板的特定传输提供程序。

ncb_cmd_cplt

指定命令完成标志。 此值与 ncb_retcode 成员相同。

ncb_reserve[18]

保留;必须为零。

ncb_reserve数组的长度 X 取决于系统体系结构。 对于 64 位系统,数组包含 18 个元素。 否则,数组包含 10 个元素。

ncb_reserve[10]

保留;必须为零。

ncb_reserve数组的长度 X 取决于系统体系结构。 对于 64 位系统,数组包含 18 个元素。 否则,数组包含 10 个元素。

ncb_event

指定事件对象的句柄,该句柄在接受异步命令时设置为未签名状态,并在异步命令完成时设置为信号状态。 如果 Netbios 函数返回非零值,则会发出事件信号。 仅应将手动重置事件用于同步。 指定的事件不应与多个活动异步命令相关联。

如果ncb_command成员未设置 ASYNCH 标志,或者ncb_post不为零,则ncb_event成员必须为零。 否则, Netbios 将返回 NRC_ILLCMD 错误代码。

注解

使用 ncb_post 相比,使用 ncb_event 发出异步请求所需的系统资源更少。 此外,当 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 接口概述