Delphi实现NetBIOS广播收发
2008-04-09 04:18:31来源:互联网 阅读 ()
NetBIOS网络协议对于很多读者来说可能比较陌生,但其实它是由IBM开发的一个很古老的协议,当年在LAN上也风光一时。说它老,其实也不过10年光景,IT业的发展实在是太快。由于NetBIOS不具备路由功能,也就是说它的数据包无法跨网段传输,因此在广域网、城域网大行其道的今天,它已退居配角。如果你有心的话,能够发现在Window95 / 98的网络协议中仍然保留着NetBIOS,不过它已经改名叫NetBEUI(NetBIOS扩展用户接口),是NetBIOS的Microsoft改进版。另外在TCP/IP以及IPX/SPX协议中,也依然保留了对NetBIOS的支持,只要查看网络协议属性中的高级,就能看到启用NetBIOS的选项。
之所以这样是有原因的。NetBIOS协议短小精悍,非常适用于小型局域网,特别是一些对实时性要求较高的网络环境。NetBIOS的广播功能由于有开发使用方便、系统开销小的优点,所以在很多场合仍然被大量使用。笔者由于工作需要,在一个航天测控软件的编制中就使用了NetBIOS广播功能。
我原以为这是件很简单的工作,因为WIN32API中提供了一个Netbios函数,里面封装了所有函数和数据结构,用起来很方便,在BC和VC下都如此。可是由于这次是使用流行的Delphi作编译器,却遇到了意想不到的麻烦:号称全面移植WIN32API的Delphi中偏偏没有Netbios函数!这下顿时让我方寸大乱。怎么办?总不能从底层干起吧?而且时间也不允许。在冷静下来之后,我忽然想到,既然WIN95支持NetBIOS,那么系统就一定会提供DLL支持,编译器本身是没有底层支持的。于是我在机器中搜索,果然,在SYSTEM目录下有一个Netbios.dll,用快速查看将其打开,在导出表部分显示如下:
导出表:
序数 入口 名称 0000 00001a37 NetbiosAddthd 0001 000019eb NetbiosDelete 0002 00001a96 NetbiosDelthd 0003 000019b1 NetbiosInitialize 0004 0000186b PostRoutineCaller 0005 0000102e _Netbios
注意到那个0005号_Netbios导出函数了吗?那就是我需要的!经过紧张的试验调试,证明它和WIN32API手册上的Netbios完全一样。剩下的工作就比较简单了,定义一个NCB(Netbios控制块)记录,将NCB数据结构封装在里面;声明一个后处理例程以及消息处理过程,以完成广播数据的接收和发送。有关NCB数据结构的详细内容以及NetBIOS广播的原理,限于篇幅我就省略了。需要的朋友可以查看BC或VC的Help或相关书籍。下面是有关的Delphi源代码。
/////////Netbios单元///////////
unit netbios;
interface
uses windows,messages,Forms,SysUtils;
type
{$X+}{$A+}
file://声明一个NCB记录指针。
PNCB=^NCB;
file://声明一个后处理例程的过程类型。
POST=procedure(var ncbR:PNCB);
file://以下是NCB记录,教训1:将上面的编译选项置为{$A+}以取消数据对齐。如果在广播中有浮点数的话,数据对齐会让你大吃苦头!我已经有过惨痛教训!:(
NCB=record
ncb_command:UCHAR;
ncb_retcode:UCHAR;
ncb_lsn:UCHAR;
ncb_num:UCHAR;
ncb_buffer:PCHAR;
ncb_length:WORD;
ncb_callname:array [1..16] of UCHAR;
ncb_name:array [1..16] of UCHAR;
ncb_rto:UCHAR;
ncb_sto:UCHAR;
ncb_post:POST;
ncb_lana_num:UCHAR;
ncb_cmd_cplt:UCHAR;
ncb_reserve:array [1..10] of UCHAR;
ncb_event:HANDLE;
end;
file://声明自己的Netbios函数。教训2:一定要使用pascal调用规范,否则,嘿嘿!!
function NetbiosSR(ncbX:PNCB):UCHAR;pascal;
file://初始化NCB。
procedure InitNCB(var ncbY:PNCB);
file://后处理例程,注意使用远指针。
procedure postrout(var ncbR:PNCB);stdcall;far;
var
char_buffer:array[0..511]of UCHAR;
int_buffer:array[1..512]of Byte;
implementation
file://调用系统的Netbios。dll中的Netbios函数标号是6。Delphi搜索外部文件的顺序是当前目录→系统目录→其他目录,别忘了保证存在Netbios.dll。
function NetbiosSR(ncbX:PNCB):UCHAR;external
‘netbios'' index 6;
procedure InitNCB(var ncbY:PNCB);
var
x:integer;
begin
ncbY.ncb_command:=0;
ncbY.ncb_retcode:=0;
ncbY.ncb_lsn:=0;
ncbY.ncb_num:=0;
ncbY.ncb_length:=512; file://数据缓冲长度,最大512B。
for x:=1 to 16 do
begin
ncbY.ncb_callname[x]:=0;
ncbY.ncb_name[x]:=0;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash