说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

用Delphi实现NetBIOS广播收发

HTML文档下载 WORD文档下载 PDF文档下载
用Delphi实现NetBIOS广播收发

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的Dlphi中偏偏没有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+}

//声明一个NCB记录指针。

PNCB=^NCB;

//声明一个后处理例程的过程类型。

POST=procedure(var ncbR:PNCB);

//以下是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;

//声明自己的Netbios函数。教训2:一定要使用pascal调用规范,否则,嘿嘿!!

function NetbiosSR(ncbX:PNCB):UCHAR;pascal;

//初始化NCB。

procedure InitNCB(var ncbY:PNCB);

//后处理例程,注意使用远指针。

procedure postrout(var ncbR:PNCB);stdcall;far;

var

char_buffer:array[0..511]of UCHAR;

int_buffer:array[1..512]of Byte;

implementation

//调用系统的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; //数据缓冲长度,最大512B。

for x:=1 to 16 do

begin

ncbY.ncb_callname[x]:=0;

ncbY.ncb_name[x]:=0;

end;

ncbY.ncb_rto:=0;

ncbY.ncb_sto:=0;

ncbY.ncb_lana_num:=0;

ncbY.ncb_cmd_cplt:=0;

for x:=1 to 10 do

ncbY.ncb_reserve[x]:=0;

ncbY.ncb_event:=0;

end;

//后处理例程的作用是当接收到广播消息时,立即向相应窗口发送消息。我在这里偷了点懒,以广播方式发送一个定时器消息。如果你愿意可以向指定窗口发送自定义消息,这样要复杂一些。首先,要把指定窗口的句柄传递给后处理例程。通常这是做不到的,但可以利用一些技巧做到。在NCB记录后面紧挨着声明一个句柄类型,然后把指定窗口的句柄赋值给它的实例变量;这样句柄变量的地址与NCB是连续的。在后处理中通过指针或汇编语句将ncbR的地址移到最后一个字节+1,就是窗口句柄的起始地址。明白吗?至于自定义消息,需要重新编译连接库,限于篇幅我就不罗嗦了,有兴趣的可以自己尝试。

procedure postrout(var ncbR:PNCB);

begin

sendMessage(wnd_BROADCAST,WM_TIMER,0,0);

end;

end.

////////窗口单元//////////

unit broadcast;

interface

uses

Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,

netbios;

type

Tmain=class(TForm)

private

{Private declarations}

//消息处理过程,注意消息宏要与后处理中的一致。

procedure post_main(var Message:TMessage);message WM_TIMER;

public

{Public declarations}

end;

var

main: Tmain;

ncbname:UCHAR;

ncbRock:PNCB;

post_add:POST;

implementation

{$R *.DFM}{$A-}{$I-}

/////////主窗口建立过程/////////

procedure Tmain.FormCreate(Sender: TObject);

var

ret:UCHAR;

i,x,y:integer;

p:single;

begin

new(ncbRock);

randomize();i:=0;

FillChar(char_buffer,sizeof(char_

buffer),0);

post_add:=@postrout;

//取后处理例程的地址。

ncbRock.ncb_buffer:=@char_buf

fer; //取数据缓冲区的地址。

InitNCB(ncbRock);

ret:=9;

ncbname:=random(100);

ncbRock.ncb_name[1]:=ncbna

me;

ncbRock.ncb_command:=$30;

//加名,ret为0加名成功。

while ((i<10)and(ret<>0)) do

begin

ret:=netbiosSR(ncbRock);

i:=i+1;

end;

if ret<>0 then

begin

for i:=1 to 20 do

messagebeep(-1);

MessageDlg(‘网络通信无法实现!您需要关闭程序重新运行.',mtWarning,

[mbOk],0);

end

else if ret=0 then

begin

ncbRock.ncb_post:=post_add;

ncbRock.ncb_command:=$a3; //异步接收方式字。

ncbRock.ncb_event:=0;

ncbRock.ncb_length:=512;

ret:=netbiosSR(ncbRock);

end;

end;

///////////广播消息处理过程/////

procedure Tmain.post_main(var Message:TMessage);

var

x:integer;

ret:UCHAR;

begin

//取出数据缓冲区的内容

for x:=0 to 511 do

int_buffer[x+1]:=char_buffer[x];

////以下可以进行数据处理////

//重新打开异步接受。

ncbRock.ncb_post:=post_add;

ncbRock.ncb_command:=$a3;

ncbRock.ncb_event:=0;

ncbRock.ncb_length:=512;

ret:=netbiosSR(ncbRock);

end;

end.

注:广播发送非常简单,不再详述。上述程序经过一年运行完全可靠。另外,经过改造可以将其改为LAN下的聊天程序。

Windows 的登录资料库 -VB资料 把回车键变成TAB键-VB资料 把文件置入到Text或RichText中 -VB资料 避免按 [ENTER] 回车键产生的“嘀”声 -VB资料 避免使用全局变量-VB资料 避免装载多份应用程序-VB资料 不定个数的参数 -VB资料 不在任务栏中显示,只能在Ctrl+Alt+Del对话框中显示或者干脆什么也不显示数 -VB资料 处理 Dropdown List型 Combo的录入问题-VB资料 VB创建和删除快捷方式 从程序中生成 exe 文件 -VB资料 打开和关闭CD-ROM 驱动器 -VB资料 打开和关闭其他应用 -VB资料 打开一个超连接 -VB资料 当前操作系统的语言集-VB资料 当前系统目录-VB资料 得到磁盘上剩余空间的值-VB资料 调用“添加打印机”对话框 -VB资料 调整分辩率和取当前分辩率 -VB资料 定义全局热键-VB资料 动记录应用软件工作时间-VB资料 动态改变屏幕设置-VB资料 读取档案的建立时间及存取时间 -VB资料 多个参数的属性 -VB资料 发现剪帖板的秘密 -VB资料 发现拖(Drap)过来的信息 -VB资料 防止打开同个VB应用多个实例 分割图像的原理 -VB资料 封面的设计 -VB资料 改变 Win95 的 Shell -VB资料 改变墙纸 -VB资料 各位能不能介绍点比较经典的算法的书籍,大家分享一下 如何恢复或新建临时表空间????在线等候!!!马上给分! Gis 请教一个数据库的问题,欢迎发言提出解决方案 ??怎样用asp程序把一段html代码转换成纯文本格式? 下拉数据窗口不能下拉是什么原因啊? 有关用VB做数据库的简单问题、ComboBox控件问题! 大家帮我看看这段程序为什么值为0 oracle8.1.7的数据库备份文件怎样恢复到oracle8i上 ? 怎样屏蔽flash的右键菜单,弹出自己的菜单? 我想问一下有没有不写入数据库用ASP代码可以查看当天的浏览访问量 灌水区的水越来越没质量了,你觉得呢? 按钮消息响应的问题,详细请看进去再看 异常详细信息: System.Data.OleDb.OleDbException: 无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开。 求助,网页制作0=={=========>(在线等,送分) 谁能告诉我《C++Builder 5编程实例与技巧》这本书在哪儿可以下载到完整的电子版!高分感谢! 请教如何将一张图片旋转? 关于流媒体和vc++的结合,高人请进!! 关于DataOutputStream和DataInputStream求教 会DirectX的一起来讨论! 4444 菜鸟求助~~~ help me 刚才发现www2.google.com www3.google.com也不能访问了,见鬼:( 我想停止window2000[域控制器]的389端口,但我不知服务是不是LDAP,因为我想占用端口389 各位!帮个忙! 帮忙啊!因为很着急,只有在技术论坛发了,大家原谅 电子地图 上海的程序员都在哪里"混"? 如何最小化所有窗口? 你们有谁读大学一学年要交近1000元书籍费? 帮忙啊!因为很着急,只有在技术论坛发了,大家原谅 asp中如何使用ADO实现对sql数据库操作 求助,网页制作0=={=========>(在线等,送分) 我在用mcisendcommond()函数时,总提示设备类型出错,是什摸原因? 紧急求教高分相送100分。 怎么判断女孩喜欢你? CSDN的首页能登录吗? C 与 C++ 到底有什么不同?? 偶然发现的mysql排序问题 是否有专业PL/SQL编辑器(能够提供类似VC的类成员或方法提示、格式自动排版等功能)可以下载 ?? 关于条码编程 非常急,请各位帮忙想想办法 怎样实现同一窗口的不同字体大小的显示 请问谁有HTTP代理服务器内容检查与病毒检查的代码 在程序流程中要等待几秒,应该调用什么函数啊 请问各位高手,哪有C++ Builder 教程可供下载? 有没有办法使用VC控制键盘做Reset动作,即键盘自测的动作。 怎样建立一个企业的WEB网站 高程考试寻求帮助 新店开张,欢迎光临 如何测红酒花青素 葡萄属于酸性还是碱性 在括号中填上恰当的词:1.悬泉瀑布,飞欶( )期间.2.( )清( )荣( )峻( )茂,良多趣味. 玻璃镜子如何擦干净呢?如何能擦干净,而又不会划花玻璃? GB/T2882-1991是指什么标准 围绕“今天真热啊”为开头,并围绕这个中心意思写一段话. 有没有什么好的办法把玻璃和镜子擦的又光又亮啊 眼镜刮花怎么能除去我的是树脂的眼镜加膜了怎么处理?那痕迹很长延长到中间怎么办?是刮花的痕洗得去的吗? 孔和轴的公差带大小是由什么决定的 关于哺乳动物运动系统的叙述正确的是 a 运动系统由骨,关节,骨骼肌组成 b 关节由关节头与关节窝与关节腔组成 c关节软骨与关节腔中的滑液,增强了关节的灵活性 葡萄皮是碱性还是酸性? (10)已知锌与稀硫酸反应为放热反应已知锌与稀硫酸反应为放热反应,某学生为了探究其反应过程中的速率变化,用排水集气法收集反应放出的氢气,实验记录如下:时间(min)12345氢气体积(mL)3012028 请问,怎样才能把玻璃或镜子擦干净 液体温度计通常由____,_____,______,挂环组成 《藤野先生》语句品析但一位先生却以为这客店也包办囚人的饭食,我住在那里不相宜,几次三番,几次三番地说.我虽然觉得客店兼办囚人的饭食和我不相干,然而好意难却,也只得别寻相宜的住 哺乳动物运动系统由骨,关节,骨骼肌组成这句话说得对不对,错的话理由 青城山里面的青青园宾馆在地震中倒了吗如题,不知道有没有人知道这件事啊 显微镜观察到细胞标本偏左上方 怎么解决 请问花青素吃的什么 牌子. 当机体受到伤害性刺激时,神经系统和内分泌系统都有哪些反应?有何生理意义? 用水重结晶乙酰苯胺,在溶解过程中有无油珠状物出现?如有油珠出现应如何处理? 现在有什么眼镜可以防紫外线吗? 天文望远镜的物镜口径做得较大,是为了--------------------?如题啊.thanks you 在对肿瘤的免疫监视中,起重要作用的细胞是什么? 花青素保健品什么牌子好是花青素,不是原花青素 阅读下面材料 写出寓意山野里,一株骄傲的白玉兰芳香四溢. 啄木鸟总是啄个不停.“太吵了,赶快离开!你打扰了我的美梦.”白玉兰说.啄木鸟默默的离开了.白玉兰只留下一群如花般的黄鹂相 免疫具有( )抗原侵入,( )体内衰老,死亡或损伤的细胞,监视,( )和( )体内产生的异常的功能 意大利花青素哪牌子好 阅读下列材料,然后写出其中包含的寓意小姑娘又问苹果:“苹果,你为什么没有长成小瓣呢?是为了让我一个人独吃吗?”“不!”苹果回答,“是为了让你能完整地把我奉献出去.” 下列属于免疫监视功能的是A.呼吸道粘膜纤毛清除异物的作用B.人体随时清除体内的肿瘤细胞C.胃酸杀死胃内的细菌D.噬食体内衰老、死亡、损伤的细胞 实验需要400毫升0.1摩尔每升的硫酸铜溶液,配制溶液时需要称取五水和硫酸铜的质量应是? 阅读下列材料,写出爸爸的意思.女儿将一位生病的同学送到医院,诊断治疗后又将同学送回家,回到自己家里时才想其一件事.女儿对爸爸说:“爸,我忘了跟您买生日礼物.”爸爸笑着对女儿说: 细胞免疫最终怎么清除抗原的?说到了使靶细胞裂解使其中的抗原暴露出来,然后怎么清除抗原?是进行体液免疫么?还是T细胞又怎样了? 比如说硫酸铜溶液,它的摩尔质量为什只有CUSO4的,这这个溶液中含有水,为什么没水的摩尔质量为什么没水的摩尔质量改为为什不加上水的摩尔质量 求问橡胶止水带需要检测哪些项目? 藤野先生一文中最能表现鲁迅对藤野先生怀念之情的词语是 现代天文望远镜力求把物镜的口径做得很大,这样做的目的是让物镜尽可能____. 根据意思写“一”字开头的成语: 如何理解《藤野先生》一文中的“也许”一词? 天文望远镜 口径、焦距大小与成像关系1.口径不变 焦距大小与成像关系2.焦距不变 口径大小与成像关系3.口径焦距最好的比例?不懂怎样问~呵呵口径是指物镜口径在网上看到70/900 80/500 80/800 90 写“一”字开头的成语1、比喻互相配合,互相呼应.2、形容一水之隔,往来方便.3、知道、理解得不够全面透彻.4、一眼就可以看清楚.5、形容十分规矩、严肃.如:形容阅读速度很快。一目十行 关于尺寸公差带的问题 我想要加工一个Φ190H8Φ150H8的零件 请问公差带分别是多少 三轴飞行器和四轴飞行器各有什么优势和难点 葡萄是酸性还是碱性的为什么化学书上测PH是酸性的呢? 写几个“一”字开头的成语. 在MgSO4和Al(NO3)3、Mg(NO3)2溶液中镁离子、铝离子、硫酸根,为什么?原因是什么? 葡萄是酸性还是碱性 仿照例子写出词语例:亮晶晶明___ 毛____ 软______ 喜_______ 凉________ 葡萄是强碱性的,那为什么葡萄干是酸性的? 镜子背后刮花了怎么办 按要求或仿照例子写出有关词语描写天空的四字词语例:ABCC银光闪闪:( )( )( )( )例:ABAC自私自利:( )( )( )( )例:AABC奄奄一息:( )( )( )( ) 含有花青素的植物叶子呈红色,它是用花青素进行光合作用的吗? 葡萄是碱性还是酸性 仿照例子分别写词语1.例:白雪—雪白 2.例:相互—互相急用啊 葡萄干是酸性还是碱性经查资料得知:有的说是碱性 而有的说是酸性。众说纷纭,有没有确却点的答案? 葡萄属于碱性还是酸性 铁离子和SCN根离子能共存吗 葡萄干到底是碱性还是酸性的? GB 3275-91什么意思 ‘悬泉瀑布,飞漱其间.’中悬泉瀑布的逐字意思和四字总体意思,
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘