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

用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下的聊天程序。

【独家专访】腾讯陈磊:你不知道腾讯对开源有多爱 地下数据交易网站Rescator被黑,疑似Target报复 Spark独门秘籍:打造结构一体化、功能多元化的高效数据流水线 【走进支付宝】重磅嘉宾!历届“走进企业”回顾 【OSTC讲师专访】腾讯TDW项目:开源的分布式数据仓库 ID爆发的物联网时代,我们该如何管理手中的数百个账户 取代Google Maps?苹果大幅优化Apple Maps用户体验 中交兴路系统架构师杨晓明:Hadoop+Storm+ HBase…,打造交通行业创新型服务 雨果&#183;巴拉的第二春:我与小米的那些事儿 为什么Android Wear能统领智能手表领域? LinkedIn缘何抛弃Ruby,转投NodeJS怀抱 【OSTC讲师专访】九秒社团李明:开源对游戏产业的渗透与帮助 IBM 2014中国论坛:挖掘新互联网时代下“智慧企业”的发展之路 Facebook工程部副总裁Cory Ondrejka谈企业在早期所遇到的管理瓶颈 小团队管理工具选择:不需要大而全 《近匠》聚合CEO左磊:基础数据免费,API开放 IDC:HTML5与原生应用之争还将长存 不甘称臣,Google誓要击败Amazon 【OSTC讲师专访】腾讯追风(QcloudMna):开源移动加速SDK Google Go:一门为云而生的编程语言 3月26日:没有Larry Page,就没有今天的Google Hortonworks再获1亿美元融资,Hadoop领域三足鼎立 Intel收购Basis Science,欲拓展可穿戴设备市场 Facebook以20亿美元收购Oculus:虚拟现实将是未来计算平台又一大事件 基于NodeJS的14款Web框架 Hadoop导航:版本、生态圈及MapReduce模型 把黑匣子送上“云” 失联困境能否不再 看看全球十大电信巨头的大数据玩法 尹绪森:打开圈子拥抱变化,谈Spark玩家的自我修养 从Healthbook看苹果将如何颠覆移动医疗和健身追踪 Google可穿戴:详解Android Wear的十大功能 熟悉 DirectShow高手请进 vc6.0有没有库graphic.h和 bios.h? 水晶报表ReportSource 的绑定问题 在线等待,回答马上给分(关于存储过程参数问题!!!!!!!!!!) 100分相赠,求短程序!! 一个很简单的问题,帮帮我!! applet中参数如何保存到数据库?急!!!!!!!!!!!!!!! 如何在自己的函数中向指定菜单(比如“保存”)发消息 求助!!! 数据增加问题!解决马上给分! 请指教!!! 下载了源代码之后怎么打开呢? 再问一个字符串问题 如何用C语言读键盘缓冲区,这样为什么不行? 如何实现这样的窗体,马上给分!! weblogic 7.0 连mysql的pool出错,看看 毕业论文:各种排序算法的比较与分析。高分求相关资料。 如何将当前页面textarea的内容传递给新打开的页面中的iframe中? 求助:Windows XP 无法安装DirectX SDK? 怎么把64*64 bmp缩小为32*32 菜鸟问题,急需解决,请大家帮忙!! 问一个数据库相连的简单问题 毕业论文:各种排序算法的比较与分析。高分求相关资料。 关于my3b (重阳公子) 的注释的问题,我也在奇怪. 平铺的数据 征集意见:写一个酒店管理系统.分不够再加 vb.net是怎么回事/?在学之前要哪些基础准备? 在VMware如何装SCO UNIX 谁有VMware版的SCO UNIX 5.06啊!!! 如何实现啊?---- 求一个函数! 50分,请大家帮忙寻找这个笔记本网卡驱动紧急求助(Fast Ethernet pc card) 求 Quoted-Printable,8bit编码方式的解码函数 菜COM:DELPHI如何独立编译,WAITING ONLINE 请求速答 请指点 但不知pb是怎么回事 在学之前要哪些基础准备? Authorware新家园,捧捧场哦 各位,那有候捷翻译的《windows 95系统大奥秘》的简体中文版可下啊 关于作用域 反对有些人以爱国或真理为名侮辱我们的政府!!!!! 但不知delphi是怎么回事 在学之前要哪些基础准备? 请问 SET XACT_ABORT ON 怎么用啊 散分!!分不够再加!!! 请问扩展名名为asp的文件怎么打开? [ZT]GOOGLE的彩蛋 看看,怎回事? Xsl:for-each进行循环,如何能从循环中退出!急急急!!!给分 怎样实现更新 DBGrid 选中的多行记录? 有人能帮我看看这个存储过程到底是为什么运行不了吗?晚上结 请教高手 :在一个bean内只能有一个结果集吗? 如何从表单radio中得到它的value值呀. 验证问题 还是没有解决windows NT密码丢失问题啊 如图所示是一种自动测定油箱内油面高度的装置,R是滑动变阻器,它的金属滑片P是杠杆的一端.从油量表(电流表改装而成)指针所指的刻度,就可以知道油箱内油面的高度.问:如果要用电压表 红砖柱长,宽,高,1000*500*3500,单个柱能承受多重的力 介绍基本关于道教的书推荐些好的,关于道教史的也好南怀瑾大师的书也好 在四棱锥P-ABCD中CD//AB,AD⊥AB,AD=DC=1/2AB,BC⊥PC,(1)求证PA⊥BC(2)若M是线段PB中点,求证:CM‖平面PAD 一实心正方体,棱长为3cm,质量为156.6g,密度是多少,物体平放在1m²的水平桌面正中央,桌面受到的压强是 Pa(g=10N/kg) 在竖直屏幕前有一点光源S,从这点光源 右侧有一小球向右水平抛出,则小球的影子在屏幕上的运动情况是()为什么是匀速运动?希望能给解决! 高的反义词是什么请帮回答 道教四大名山龙虎山用英文怎么翻译? 请问电梯门这样的画法 那它的开门方式是哪一种 反义词的快来平坦 魁梧 忙乱 道教之音用英语怎么说?道教之音翻译成英文 电梯启动问题,求办法1楼.电梯向上起动时,有明显向上拉的感觉,向下启动时,有向上倒溜.不知道是不是平衡系数的原因,还是零速启动补偿太小,还是什么原因.电梯是新安装不久的,以前好像没 高的反义词是什么 一般电梯的机械效率是多少 一小球以水平速度Vo抛出,在抛出处有一点光源S,在抛出点正前方有一竖直墙,墙上小球的影的运动是A自由落体运动 B变加速直线运动 C匀加速直线运动 D匀速直线运动 翻译 我记得家里还有些鸡蛋和牛奶 I remember ____some eggs and milk ____at home 竞走和跑步有什么区别啊? the article is very beautiful的中文意思?求英文水平好的朋友翻译下这句英文 手写拍照发过来,已知3倍根号(x²-4)=根号(y-2)+根号(4-x²)-根号x,求2x²-xy+y²除以x²-xy+y²的值. 跑步和竞走的区别在于》 boy is very beautiful是什么意思? 汽车开在水平公路上,在一个瞬间内轮胎与地面接触的那个点,在瞬间的速度是多少 如图所示,杠杆在水平位置平衡,A.B 为同种材料制成的正方体,边长分别为 0.2m 和 0如图所示,杠杆在水平位置平衡, A.B 为同种材料制成的正方体,边长分别为 0.2m 和 0.1m, 且已知 OA:OB=1:2,物体 A 对 古代和神话传说中有哪些名剑宝剑 there isn't any ink in the bottle、are there any eggs in that basket,什么意思 像a little a lot lots of less lest many much等这样表述数量多少的不管是不可数名词还是可数名词的词?全部的写给我一下. The pair of giant pandas(填什么,有关add)the pleasant atmosphere at the Spring Festival Evening Part选项为A.added B.added to C.added in D.added up to Are there any eggs in that badket? 在500mL Fe2(SO4)3和CuSO4的混合溶液中加入16.8g的铁粉,搅拌并充分反应后,经过滤、洗涤、干燥,可得到6.4g铜,.要使溶液中SO4 2-完全沉淀,需加入2mol/L的BaCl2溶液500mL.则原混合溶液中硫酸铜的物质的量 the evening of the midautumn festival介词,是用on 还是in?还有有关什么of的短语介词是怎么用的,比如the morning of May 1st ,怎样判定是用哪个介词? 如果你的左边是一面墙,你在中间,右边是三个灯泡,那么照到墙上有你的几个影子拜托各位了 3Q谁式式看 高手come onHe looked rather untidy as there were two buttons --- from his coat.空格里填off 为什么? 宋开国丞相赵普曾说:"半部《论语》治天下. 一个直角梯形,画一条直线变成三个三角形 化学沉淀溶解平衡的难题 高手come on!就拿AgCl当例子吧1.少量AgCl固体在溶液中溶解 溶解部分完全电离AgCl==Ag+ + Cl-可是根据沉淀溶解AgCl(s)Ag(aq)++Cl-(aq) 又是怎么回事?2.如果我拿未饱和的AgCl溶液 鱼类急性毒性试验怎么做,谢谢各位大神 亲爱的( )800字左右,文笔好一点的,现在人的思想太脏了.拜托是作文, 变频电梯频率与额定速度公式曳引机比为53:1 曳引轮直径为680mm 电动机转速为1465 曳引比为2;1 求额定速度为0.6m/s时,应设置的频率为多少HZ? Most of the people hold the view that fireworks can___the festival atmosphereA.add B.add to C.make for 为什么选B不选C make for 不是有促成的意思吗to 和 make for 的区别。举例。 如某品牌汽车质量为M,汽车行驶时弯道部分的半径为r,路面倾角为a(g=10),动摩擦因数为u路面倾角为a(g=10),为使汽车不打滑,最大速度为多少,正弦值=0.05,r=60m,u=0.3,则弯道汽车行驶最大速度是多少 Jim can you help me take away the r__ 填什么, 如何寻找带点粒子在磁场中的圆心以及半径 RT 亲爱的,聪明的打救我 快 Jim can you help me take away the r___?请那位大虾告诉我填什么! ________Chinese which city is famous for ice and snow,and the answer is sure to be Harbin.A.If you ask a B.Asked someC.Ask any D.Having asked every省略If就要加and,否则不要and吗?the answer is sure to be Harbin 不应该用将来 如果某品牌车的质量为m,汽车行驶时弯道部分的半径为r,汽车轮胎与地面摩擦力为u,路面设计的倾角为β为使汽车转弯时不打滑,汽车行驶的最大速度是多少? 在800米长跑比赛中,裁判员用什么表测量时间电子停表或机械停表 the city of harbin is beautiful all the year aroundthe city of harbin is beautiful all the year around,_________in winter .ice lanterns decorate streets and attract plenty of tourists 用托盘天平称量一个小烧杯的质量,当天平的指针不在零点而偏向右是开始称量,砝码为5g,游码为0.4g,则当天平达到平衡时,小烧杯的实际质量是大于5.4g还是小于5.4g或者等于5.4 曳引式电梯具有什么特点? 无电无动力抽水泵 比例和比例尺有什么区别 已知,三角形ABC中A(-1,-7/2),B(6,0),C(1,3/2)点D(2/5,0)在AC上,求ABC的面积.(平面直角坐标系中的面积问题,一定要有过程) writing怎么读 用托盘天平称量小烧杯的质量为多少 电梯曳引轮绳槽一般是什么形状的?+电梯曳引轮绳槽一般是什么形状的 she的第三人称是什么?Can you help _____(she)? 小红同学用托盘天平称量烧杯的质量,天平平衡后的状态如下所示,该同学称取的烧杯实际质量为( )A.23.8g B.32.6gC.32.3g D.27. 请问曳引机的曳引比是怎么计算的,如何判断电梯的曳引比?曳引比和绕绳比有什么区别吗? 英语翻译上面那个数字是我的Q,麻烦send to my e-mail 孟加拉国客机厕所中现280块金锭 价孟加拉国客机厕所中现280块金锭 价研究称美国人网购母乳风险高 75%或研究称美国人网购母乳风险高 75%或芬兰一研究人员拟通过拍摄关注当地避难澳新州消防部门提醒当地居民撤离以应对日本东京警视厅一警官因涉嫌唆使少女卖日本进行冻结核污水实验 望解决污染水分析称政府再停摆凸显美国政治新焦点妻子选总统 洪都拉斯被罢黜总统或可重美国男子冲浪遭遇鲨鱼 用拳击技巧击将马来西亚妇女操作轿车不当误撞死邻居7俄达吉斯坦地方官员遇袭身亡租客伪造房产证卖掉了房子 新\"房东浙江省新增1例人感染H7N9禽流感病美情报局局长指有关美监听事件部分报道日本长崎附近海域发现元朝军队沉船遗骸研究称美国人网购母乳风险高 75%或大型枪击案频发 美拟采新策略应对“活联合国官员称澳森林大火与该国废除碳税芬兰一研究人员拟通过拍摄关注当地避难斯诺登女友拍照传话?东莞快递方便面盒内现疑似毒品 公司怕UFO目击事件增多 秘鲁重启UFO调美天文会议 向中国研究人员发澄清信喜马拉雅“雪人”疑是“熊孩子”怀旧的耳朵本周天气主打多云到晴天捡到600万交公 不必“抌心口”一汽通用解放F330速豹获技术大奖马拉松赛 遍地开花,距离金标 广州马世界首款应用安全带的老爷车来咯!珠海一小伙溜冰时被4人压倒 摘除右肾长安镇《小小冠军梦》揽全国大赛三大奖银行布局P2P网贷或为“监管套利”精英特刊崇德向善 他们引领普及山洪灾害防御知识《女起解》:谁懂江湖言?孔子的好学观(下)英国主题乐园鬼屋模拟强奸环节 “性虐悉尼歌剧院40岁啦!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘