NetBios结构参数的详细说明及其简单用法 (200分)

  • 主题发起人 主题发起人 秦敏平
  • 开始时间 开始时间

秦敏平

Unregistered / Unconfirmed
GUEST, unregistred user!
因为 E 文不好,所以敬请各位大虾帮帮忙,详细说明一下该结构
各成员的功能及其简单用法. 不成敬意 200 分送上.
 
通过程序获得本机的MAC地址

Function NBGetAdapterAddress(a:integer) : String;
Implementation

{$R *.DFM}

Procedure TForm1.Button1Click(Sender : TObject);
Begin
label1.Caption:=NBGetAdapterAddress(StrtoInt(Edit1.Text));
End;

Function NBGetAdapterAddress(a:Integer) : String;
Var

NCB : TNCB; //NetBios控制块
ADAPTER : TADAPTERSTATUS; //取网卡状态
LANAENUM : TLANAENUM; // Netbios lana
intIdx : Integer; //临时变量
cRC : Char; //NetBios返回值
strTemp : String; //临时变量

Begin
//初始化
Result := '';

Try
// 内存清零
ZeroMemory(@NCB, SizeOf(NCB));

// Issue enum command
NCB.ncb_command := Chr(NCBENUM);
cRC := NetBios(@NCB);

// Reissue enum command
NCB.ncb_buffer := @LANAENUM;
NCB.ncb_length := SizeOf(LANAENUM);
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// 初始化网卡地址
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBRESET);
NCB.ncb_lana_num := LANAENUM.lana[a];
cRC := NetBios(@NCB);
If Ord(cRC)<>0 Then
exit;

// 得到网卡地址
ZeroMemory(@NCB, SizeOf(NCB));
NCB.ncb_command := Chr(NCBASTAT);
NCB.ncb_lana_num := LANAENUM.lana[a];
StrPCopy(NCB.ncb_callname, '*');
NCB.ncb_buffer := @ADAPTER;
NCB.ncb_length := SizeOf(ADAPTER);
cRC := NetBios(@NCB);

//将网卡地址转换成某种格式字符串
strTemp := '';
For intIdx := 0 To 5 Do
strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[in
tIdx]),2);
Result := strTemp;
Finally
End;
End;


End.
 
很抱歉,wangjerry,给我一份 TNCB 的成员说明就行。如
Tncb.ncb_command 接受的是一个命令字,如果可以最好能
帮我把命令字及其功能罗列出来。因为这些是我最想要的。

在这里首先谢谢你了。
 
http://www.nease.net/~laoyang/network/netbios.html
 
ncb_command字段

每一个发往NetBios的NCB都代表一项要执行的动作,具体执行哪项动作,
由ncb_command字段的取值决定。NetBios命令的使用方式有两种,即同
步和异步,同步命令将阻止提交处理的执行,直到该命令执行完毕。
而异步命令由NetBios在内部排队,并不阻止执行。命令执行完后,最终
的返回码存放在NCB结构的ncb_cmd_cplt字段中。

ncb_retcode字段

命令提交给NetBios驱动程序后,该命令的成功与否即在该字段中反映出来。若
ncb_retcode字段值为00h,则表示命令成功。对于异步NetBios命令NetBios将立
即在ncb_retcode字段中返回值FFh,表明该命令已经排队,即将执行。命令执行
完毕后,同ncb_cmd_cplt一样,ncb_retcode将置成最终的返回码。

 
ncb_lsn字段

同远程应用程序处理建立了会话后,NetBios驱动程序将相应设置该字段(局部会话号)。
在随后的通信中,若想同远程处理进行通信,本地处理只需在NCB结构中指明局部会话
号,不再需要在ncb_callname字段中指定完整的远程处理逻辑名。


ncb_num字段

工作站上的每一个处理最多可向名表中加进254个逻辑名。成功地将一名加进局域网适
配器的私有名表后,NetBios将置ncb_num字段值成该名在名表中的索引值(索引值称
为名号),在以后的同远程处理进行的非连接式通信中,可使用这个名号。



ncb_buffer字段

该字段的值是,要发送的数据缓冲区的地址,或者要在其中存放接收到的数据的缓冲区
的地址。
 

ncb_length字段

ncb_length字段指定的是,由ncb_buffer字段指定的缓冲区的长度。接收到一块数据时,
NetBios将相应设置该字段。


ncb_callname字段

这是一个由应用程序设置的16字节字段,其值是远程处理的逻辑名。应用程序设置一个
连接或向远程处理发送一个数据表包时,将相应设置该字段。所有的字节均有用。在远
程驱动程序连接正期待着接收连接呼叫的本地处理时,NetBios将填写该字段。因此,
接收呼叫的处理能够找出远程呼叫方的名。


ncb_name字段

这是由应用程序设置的16字节字段,其值是本地处理的逻辑名。
 

ncb_rto字段

在期望从一个或数个远程处理接收到一包时,应用程序可在ncb_rto(接收时间限制)
字段中指定等待的最大时间。若超过了指定时间仍未接收到包,则NetBios驱动程序将
在ncb_retcode字段中返回错误。
 

ncb_sto字段

ncb_sto(发送时间限制)字段类似于ncb_rto字段,但它指定的是等待NetBios连接式
命令,Send,完成的时间。若超过了指定时间,则将返回错误。


ncb_post字段

在提交异步命令时,应用程序可以设置该字段。在MS-DOS中,应用程序将后处理例程的
地址填在该字段中。所谓后处理例程,即命令执行完毕后NetBios驱动程序将要调用的
例程。

 

ncb_lana_num字段

因为一台工作站上可能有不止一个局域网网络适配器卡,所以,NCB中相应也有一个字段,
用来指明应用程序想使用哪一个网络适配器。该字段称为LAN适配器号或LANA号,LANA号
从0开始。


ncb_cmd_cplt字段

NetBios驱动程序利用该字段来表明异步命令已完成。起先,当应用程序提交一条异步命
令时,NetBios将置该字段值为FFh。待命令执行完毕后,再将最终值填入该字段。也就是
说,提交了一条异步命令后,应用程序可以监视(轮询)该字段的取值,直到其值不再
是Ffh为止。
 
灌水也没你这么个灌法呀! :-(
 
承蒙两位高手相助,解小弟之忧.
尤其是温柔一刀的网址让小弟受益非浅,而wangjerry的回答也十分
精彩,鉴于两位大侠的热情帮助,今小弟将其平分,每人一百.呵呵
:)
 
你到底看没看我给你的网页之中的内容啊?
“精彩回答”就在那里呀!

这年头灌水的招数真是推陈出新... :-(
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部