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

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

一应俱全!开源跨平台3D应用开发框架Minko 【线下技术培训】敏捷测试实战解析和系统方案 《近匠》Ping++:简单、高效、第三方支付SDK 有关编程的12个猜想 【问底】王帅:深入PHP内核(二)——SAPI探究 【CTO俱乐部走进汽车之家】活动图文实录 只为逼格?超薄便携式无线充电设备Deuce 戴尔未来重心:云计算、大数据、移动互联与安全 【讲师】搜狐于顺治:Container在搜狐PaaS平台中的应用实践 【先锋】从代码层诊断,云端OneAPM平台让开发者专注开发 阿里将推无线领域重磅计划 阿里百川无线开放大会揭晓 提升网站转化率的四步优化方案 开发者应该了解的API技术清单! 【讲师】腾讯刘永峰:Docker时代,公有云面临的挑战和机遇 移动开发工具服务商Mob推出免费短信验证码SDK 遇见他们,MDCC 2014移动开发者大会嘉宾揭秘 揭秘全球最小无线耳机背后的技术 《最终幻想》之父访谈:我为何转战F2P游戏开发 寓教于乐 11款最适合教儿童编程的学习工具 苹果iPhone6获工信部许可 本月17日在内地发售 使用Redis之前5个必须了解的事情 妆媒体微信公众号背后的酸甜苦辣 TIOBE 2014年10月编程语言排行榜:Dart首次进入前20 Instagram工程师教你如何改善App的性能 利用Neo4j对电影评论进行深度学习情感分析 【简讯】SQLite 3.8.7来了 性能提升超50% 浏览器重定向性能分析经验谈 豆瓣工程副总裁段念:看板方法核心瞄准流程中的“流动性” 【图文实录】CTO俱乐部公开课:探讨如何成为技术团队管理者 资深产品交付咨询顾问何勉谈看板:“以价值拉动”解决敏捷困扰 开源HTML5游戏引擎Frozen背后的技术 php连mssql,php.ini or httpd.conf需要改动什么地方? 关于多文档编程的超难问题,高手请进!!一定给分,我会继续加分!!! 提问:关于软件测试的若干问题,谢绝灌水者入内!高薪聘请业内人士! 请问用javascript怎么显示客户端的IP地址?谢谢 sql问题 oracle中什么权限,才能使一个用户下的表参考另一个用户下的表(就是外键)? 种了中国一号病毒,怎样才能铲草除根? yinx(yinx)请进,拿你应得的分数 请各位高手帮忙,有高分送上。 一个SQL语句的问题。谢啦 为什么我的msdn帮助系统“目录”、“索引”等里的标题都显示不出来了呢? 存储过程只能用一种方式调用吗? 数据库字段问题 如何在ADO的SQL控件中不用ODBC完成长型备注型字段的模糊查询 数据库连接问请各位指点(300分) 圖像控件和報表製作 创天中文版是怎么汉化的?我想把它改回英文的要怎么改? 请问有没有Linux版本的QQ? 找DriverStudio2.5正式版 VB6中不能使用ACCESS2000数据库??? vb中怎么调用dos命令 请问海星... 哪有visual age3.0下载? 有关FTP 我双击注册表编辑器出现"注册表编辑器被管理员禁用"是怎么回事?怎么解决? 如何更改Oracle显示日期的默认方式? *****高手请进****** ======================各位高手,看一下!UP也有分! 请问安徽的高程成绩什么时候可以查? 请问谁知道vb里面如何调用notes对象,怎么调用? 急急急,我好急,有没有办法先把记录集处理一下在绑顶到datagrid 请问为什么这一段XML代码运行不了???为什么???帮帮忙??多谢!! 请教有关手机方面的问题 连编好的可执行文件不能用 帮帮忙啊 哪儿有免费的jsp空间并且有数据库支持的?谢谢 客户机的WinSock控件采用TCP协议,如何使用预设的固定的端口? sos!Help me! 有谁知道怎样用Capwnd控件(用于捕获视频的控件)?? 请帮我看看,谢了 请问如何控制imagecombo控件的下拉高度呢? 能告诉我什么是回调函数吗?注册的系统回调函数中引入的参数能在别的地方得到吗? 在RicheEdit里的字体颜色都是黑色,能变成其他颜色吗? 请问在视中如何使主框架的某个菜单项变为不可用(代码如下,错在什么地方,如何改?)! 请教VFP中GRID的显示和取值问题 请教一些有关用ROSE进行UML设计的问题 高薪寻找合作者:医院信息管理系统 求救!!!!为什么必须多按reset键才可以启动?? 請教: WideString如何存入數據庫image字段? 如何判断一个字符串是数字串?要源码(无内容) 登陆某些网站后浏览器的默认主页不能更改,怎么办???谢谢 不锈钢无缝管承受压力求助:现有液压设备要安装,管路设计用不锈钢无缝管,液压设备最大的压力为16Mpa,请问管子选用14*2mm,16*2mm的能承受这个压力吗?顺便问问这个东西怎算计算的,谢谢!急切 已知等比数列{an}的同项公式为an=3^n-1,设数列{bn}满足对任意自然数n都有b1/a1+b2/a2+b3/a3+...已知等比数列{an}的同项公式为an=3^n-1,设数列{bn}满足对任意自然数n都有b1/a1+b2/a2+b 已知数列(an)的前n项和是Sn=n²+3n+1(n属于N*).则a1+a3+a5+……a21= 我做出来是285,答案是265 无缝钢管承受压力160mpa系数是多少 硫化皮带需满足哪些要求 已知数列{an}满足a1+a2+a3+……+an=2n²-3nº则a5=? 高压锅炉无缝钢管的承受压力是多少? 皮带硫化接头如何计算? 已知数列 ﹛an﹜的前n项和Sn=n²+2n-1 则a1+a3+a5+……a25= 无缝管的压力怎样计算 急已知 外径89 壁厚8 抗拉强度 465 求压力 煤属于岩石吗 已知数列{an}的前N项和Sn=2n²-3n,而a1,a3,a5,a7.组成一组新数{Cn},求其通项公式. 已知数列的前n项和Sn=2n^2+2n,数列bn的前n项和Tn=2-bn,设cn=an*bn,证明:当且仅当n>=3时c(n+1) 硫化皮带措施怎么写啊? 数列an的前n项和Sn=3n-n²,则an 液压表与气压表的区别我有一个量程1.6Mpa的压力表,是不是既能测气压又能测水压?压力都不超过0.8Mpa.这两种压力表在使用上有什么本质上的区别吗?(不要跟我说什么“这本质就不一样”的废 热硫化皮带的危害我是一名煤矿工人,想要咨询一下硫化皮带的危害:包括硫化时产生的气体和所使用的化学物品《胶浆》的危害. 数列 an 的前n项和sn=2n²-3n,则an= 气压表怎么调压力 已知各项均为正数的数列{an}前n项和为Sn,2Sn=3an-9(1)求{an}的通项公式(2)若bn=log3 an,Tn为数列{1/(bn*b(n+1))}的前n 项和,证明Tn<1/2 硫化橡胶具有较高的强度和化学稳定性,它具有什么结构 如果量的压力一样,气压表能否当油压表用,回答正确我会加20分的,因为现在回答中打广告的太多了, 已知数列{an}中a1=1 an+1=3an 数列{bn}的前几项和Sn=n^2+2n,设cn=an*bn,求Tn=C1+C2=C3=-----Cn 硫化橡胶具有( ) 结构 压力表和气压表的区别 下面哪些是矿物?哪些不是?水晶,岩石,宝石,玉石,冰,雪花,煤,石油 根据大气的温室效应原理 说明导致全球气候变暖的主要人为原因是人类燃烧矿物燃料 什么叫绝对压力、表压力? 数列an 中 a1=4.an=(3an-1+2)/(an-1+4) 数列bn中,bn=(an-1)/(an+2) ,求bn 以乙醇为燃料不会增加大气乙醇相对于矿物燃料的燃烧为什么不会增加大气中的CO2 数列{an} {bn}满足:a1=0 a2=1 a(n+2)=[an+a(n+1)]/2 bn=a(n+1)-an 求证 bn是等比数列和 bn的通向公式 数列an满足an+1=3an-2 a1=2,令bn=an-1求证Bn是等比数列 近年来,随着工业的发展,人类大量燃烧煤,汽油,天然气,向大气中排放的二氧化碳日益增多,使全球气温有明显变暖的趋势.2001年,地球上出现了一百多年来创纪录的高温,使全球平均温度为15.5℃.( 在沼气、石油、医用酒精、钢、干冰、熟石灰中属于含有碳元素的混合物有几种? 已知数列{an},a1=1/2,a(n+1)=3an+1,bn=an+1/21)求证{bn}是等比数列2)求an的通项式 燃料能在空气中燃烧,为了人类提供() 化石算是生物吗 我们生活中的石油煤气是不是地底下的沼气? 二次硫化皮带后,是不是说明接头不能用了,需要重新做接头 我要做作业,快 液压系统上的压力表指示要换算成油压应该怎样算呀? 哪位大虾有装载硐室皮带机安装预算?尤其是输送皮带硫化接头面积是如何计算的. 500米线路80千瓦负荷需要多大电线如何计算 液压系统的回油压力是怎么回事 对于高转速,负载大的皮带如何保证硫化接头的粘合强度? 设cn=(an+1)bn.n=1,2,3……求数列{cn}的前n项和Tn已知数列{Bn}的前n项和为Sn且2Sn+Bn=2,数列{An}为等差数列且As=14,A7=20(1)数数列{Bn}的通项公式 下列物质不能作为能源的是:A天然气B石油C煤D石灰石 美国好像发明了一种新技术,从岩石开采石油,别说不可能,参考消息上写着的,有了这个技术,预计美国会成为世界第一大产油国,知道的回答,确实有这种技术 总负荷怎么算啊我把我们公司的所有用电器(电脑.空调,灯,食堂的锅冰箱等)的最大功率都加一起了,总和为107.55KW,电表上写的是3X20(80A),3X220/380.请问有没有超负荷啊,怎么算才对啊. 已知两个等比数列{an},{bn},满足a1=a(a>0),b1-a1=1,b2-a2=2,b3-a3=3,若数列{an}唯一,求若数列{an}唯一,求a的值 硫化橡胶皮带后怎么会有气孔? 求电焊机的计算负荷施工现场临电施工组织设计,电焊机负荷计算怎么求啊,要详细一点的,还有公式,讲解什么的, 已知两个等比数列{an},{bn},满足a1=a(a>0),b1-a1=1,b2-a2=2,b3-a3=3问题(1)若a=1.求数列(an)的通 (2)若数列{an}唯一,求a的值 输送带接头硫化时,在清洗皮带与胶料时除了用120号溶剂汽油,还可以用什么呢 三相电负荷计算三十千瓦负荷要多大电线 已知两个等比数列(Sn).(Bn).满足a1=a(a>0),b1-a1=1,b2-a2=2,b3-a3=3,(1)若a=1.求数列(an)的通 已知数列{an}的通项为an=2/(n²+3n),则其前n项和Sn=? Φ57无缝钢管能承受多少压力 在数列{an}中,a1+a2+a3+...+an=n-an(n=1,2,3...),设bn=an-1,求证数列{bn}是等比数列,设Cn=bn·(n-n^2)(n=1,2,3...),如果对任意n属于正整数,都有Cn 已知数列{an}的前项和Sn=2n²+3n-3,则求数列{an}的通项公式
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn