delphi技术专题---获取网卡物理地址之TLanaENum结构步骤学习分享
2013-01-26 01:06
513 查看
除了TNCB结构之外TLanaENum结构是另外一个比较重要的结构如下所示:(同样位于NB30.pas)
其中,length成员指出本地机器共有多少个LANA编号;LANA成员代表由实际的LANA编号构成的一个数组。而length值指出LANA数组内有多少个元素会被填充LANA编号。
另外,需要说明的是,调用Netbios函数时,可以采用两种不同的方式,即同步方式和异步方式。在默认情况下,所有Netbios命令本身均是同步的。换言之,完成命令以前,会一直调用Netbios块。而对一个NCBLISTEN命令来说,当有一个客户机建立了连接,或发生某种类型的错误时,对Netbios的调用才会返回。要想异步调用一个命令,需要让Netbios命令同ASYNCH标志进行一次逻辑OR(或)运算。如指定了ASYNCH标志,那么必须在ncb_post字段中指定一个回调例程( Past Routine),或必须在ncb_event字段中指定一个事件句柄。执行一个异步命令时,从Netbios返回的值是NRC_
GOODRET(OxOO),但NCB_CMD_CPLT字段会设为NRC_PENDING(OxFF)。除此以外,Netbios函数还会将NCB结构的ncb_cmd_cplt一呐字段设为NRC_PENDING,直到命令完成为止。命令完成之后,ncb_retcode字段设为命令的返回值。
在编写Netbios应用程序时,经常需要进行如下几项操作:
.枚举系统上可用的所有LANA编号。
.重置计划使用的每个LANA编号。
.将名字加入本地名字表。
.将组名加入本地名字表。
.从名字表中删除除一个已经注册的Netbios名字。
.向网络发送数据。
.从网络接收数据。
.获取网络参数。
Netbios API虽然只有一个函数,但是它可以实现前面列出的所有操作,这是通过设定
TNCB结构的ncb_command字段来实现的。
要枚举一个指定系统上可用的所有LANA编号。具体步骤如下:
(1)申请分配一个TNCB结构。
(2)将该TNCB结构变量初始化成O。
(3)将该TNCB结构变量的ncb_command字段设为NCBENUM。
(4)为ncb_buffer字段分配一个LANA_ENUM结构。
(5)将ncb_lengrh字段设为LANA_ENUM结构的长度。
(6)以该TNCB结构变童为参数调用Netbios函数。
(7)返回常数NRC一GOODRET,表示操作成功。
对一个设计良好的Netbios程序来说,必须重置计划使用的每个LANA编号,否则,对Netbios的其他调用就会返回错误代码52(即NRC_ ENVNOTDEF)。一旦拥有一个LANA_ENUM结构,并有来自LanaEnum的LANA编号,便可针对结构中的每个LANA编号,调用NCBRESET命令来重置它们。具体步骤如下:
(1)申请分配一个TNCB结构。
(2)将该TNCB结构变量初始化成0
(3)将该TNCB给构变量的ncb_command字段设为NCBRESET。
(4)将ncb_lana_num字段设为需要重置的LANA编号。
(5)将nb_callname字符字段设为需要要使用的特定Netbios伪坏境参数。
(6)以该TNCB结构变量为参数调用Netbios函数。
(7)返回常数NRC_GOODRET,表示操作成功。
对于前面所说的ncb_callname字段说明以下几点需要补充:
.ncb_callname字段的字符0用于指定可同时进行的最大会话数。通常,操作系统会强制使用一个此最大值的默认值。例如,Windows NT 4.0的最大狱认值为64个并发会话。
.ncb_callname字段的字符2用于指定可为每个LANA增加的最大Netbios名字数量。
同样,操作系统也会强加一个默认的最大值。
.ncb_callname字段的字符3(用于Netbios客户机)是一个布尔类型的备。通过将此参数设为TRUE,一个客户机便能将机器名作为自己的Netbios进程名使用。因此,那个客户机可与一个服务器建立连接,并在不允许任何其他连接的前提下,向其发送数据。这一选项有效缩短了初始化时间。而假如将一个Netbios名字加入本地名字表,那么必须为此付出相应的代价。
type // Structure returned to the NCB command NCBENUM. // On a system containing lana's 0, 2 and 3, a structure with // length =3, lana[0]=0, lana[1]=2 and lana[2]=3 will be returned. PLanaEnum = ^TLanaEnum; TLanaEnum = packed record length: Char; // Number of valid entries in lana[] lana: array[0..MAX_LANA] of Char; end;
其中,length成员指出本地机器共有多少个LANA编号;LANA成员代表由实际的LANA编号构成的一个数组。而length值指出LANA数组内有多少个元素会被填充LANA编号。
另外,需要说明的是,调用Netbios函数时,可以采用两种不同的方式,即同步方式和异步方式。在默认情况下,所有Netbios命令本身均是同步的。换言之,完成命令以前,会一直调用Netbios块。而对一个NCBLISTEN命令来说,当有一个客户机建立了连接,或发生某种类型的错误时,对Netbios的调用才会返回。要想异步调用一个命令,需要让Netbios命令同ASYNCH标志进行一次逻辑OR(或)运算。如指定了ASYNCH标志,那么必须在ncb_post字段中指定一个回调例程( Past Routine),或必须在ncb_event字段中指定一个事件句柄。执行一个异步命令时,从Netbios返回的值是NRC_
GOODRET(OxOO),但NCB_CMD_CPLT字段会设为NRC_PENDING(OxFF)。除此以外,Netbios函数还会将NCB结构的ncb_cmd_cplt一呐字段设为NRC_PENDING,直到命令完成为止。命令完成之后,ncb_retcode字段设为命令的返回值。
在编写Netbios应用程序时,经常需要进行如下几项操作:
.枚举系统上可用的所有LANA编号。
.重置计划使用的每个LANA编号。
.将名字加入本地名字表。
.将组名加入本地名字表。
.从名字表中删除除一个已经注册的Netbios名字。
.向网络发送数据。
.从网络接收数据。
.获取网络参数。
Netbios API虽然只有一个函数,但是它可以实现前面列出的所有操作,这是通过设定
TNCB结构的ncb_command字段来实现的。
要枚举一个指定系统上可用的所有LANA编号。具体步骤如下:
(1)申请分配一个TNCB结构。
(2)将该TNCB结构变量初始化成O。
(3)将该TNCB结构变量的ncb_command字段设为NCBENUM。
(4)为ncb_buffer字段分配一个LANA_ENUM结构。
(5)将ncb_lengrh字段设为LANA_ENUM结构的长度。
(6)以该TNCB结构变童为参数调用Netbios函数。
(7)返回常数NRC一GOODRET,表示操作成功。
对一个设计良好的Netbios程序来说,必须重置计划使用的每个LANA编号,否则,对Netbios的其他调用就会返回错误代码52(即NRC_ ENVNOTDEF)。一旦拥有一个LANA_ENUM结构,并有来自LanaEnum的LANA编号,便可针对结构中的每个LANA编号,调用NCBRESET命令来重置它们。具体步骤如下:
(1)申请分配一个TNCB结构。
(2)将该TNCB结构变量初始化成0
(3)将该TNCB给构变量的ncb_command字段设为NCBRESET。
(4)将ncb_lana_num字段设为需要重置的LANA编号。
(5)将nb_callname字符字段设为需要要使用的特定Netbios伪坏境参数。
(6)以该TNCB结构变量为参数调用Netbios函数。
(7)返回常数NRC_GOODRET,表示操作成功。
对于前面所说的ncb_callname字段说明以下几点需要补充:
.ncb_callname字段的字符0用于指定可同时进行的最大会话数。通常,操作系统会强制使用一个此最大值的默认值。例如,Windows NT 4.0的最大狱认值为64个并发会话。
.ncb_callname字段的字符2用于指定可为每个LANA增加的最大Netbios名字数量。
同样,操作系统也会强加一个默认的最大值。
.ncb_callname字段的字符3(用于Netbios客户机)是一个布尔类型的备。通过将此参数设为TRUE,一个客户机便能将机器名作为自己的Netbios进程名使用。因此,那个客户机可与一个服务器建立连接,并在不允许任何其他连接的前提下,向其发送数据。这一选项有效缩短了初始化时间。而假如将一个Netbios名字加入本地名字表,那么必须为此付出相应的代价。
相关文章推荐
- delphi技术专题---获取网卡物理地址之NB30.pas单元TNCB详解以及源代码分享
- delphi技术专题---获取网卡物理地址之内存获取方式函数源码
- delphi技术专题---获取网卡物理地址之NetBios网络编程接口LANA介绍
- Delphi代码获取网卡物理地址三种方法
- Delphi代码获取网卡物理地址
- delphi mac地址 网卡地址获取,如果有无线网卡连接情况,mac地址随机获取某个本地连接网卡地址,要都写进去判断
- java,jsp获取客户端网卡物理地址
- 如何获取网卡物理地址(转载)
- java执行系统命令,获取网卡物理地址
- VC 获取物理网卡的MAC地址
- 获取机器网卡的物理(MAC)地址
- 如何获取本机网卡的物理地址
- PHP获取客户端的网卡mac物理地址
- android获取网卡的物理地址
- Linux 下获取LAN中指定IP的网卡的MAC(物理地址)
- C#获取本机和其它计算机物理网卡地址(MAC)
- [技术分享 - TMG 篇] 如何更改 TMG 的网卡 IP 地址
- VC++ 用NetAPI获取网卡的物理MAC地址
- PHP获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址
- php获取机器网卡的物理(MAC)地址