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

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

让Timer控件每5分钟触发一次事件 -VB资料 让程序启动快一点 -VB资料 VB如何调用系統的【查找】、【替换】的对话框? VB如何动态新增、移除 ODBC DSN? VB如何读取 Picture 内任何一点的颜色值? VB如何获取硬盘卷标、序列号和文件系统类型? VB如何判别程序是在Win95或NT下执行? VB如何启动控制面板? VB如何取得磁盘序列号? VB如何让Window不接受键盘输入及Mouse Click VB如何让程序拥有多个热键? VB如何让用户自行输入方程式,并计算其结果? VB如何使程序不在Ctrl+Alt+Del弹出的对话框内? VB如何使用 VB 编写自动反安装的程序? VB如何用VB建立快捷方式 VB如何用VB在桌面建立快捷方式 VB如何在 VB 中控制 Modem 行为? VB如何在VB中判断Windows9x的运行模式 VB如何在Visual Basic中实现异步执行程序 VB如何在开机时自动更换墙纸? 使回车具有 Tab 的功能-VB资料 输入时,自动转换成小写? -VB资料 显示多媒体信息 -VB资料 也谈Windows 下的自动存盘 -VB资料 一个小巧精致的CPU监视器 -VB资料 应用VB4.0实现工业控制的实时曲线和历史曲线 应用程序中实现关机功能-VB资料 萤幕抓取与萤幕保护程式 -VB资料 用VB5.0创建Windows快捷方式 用VB5.0收集键盘和鼠标信息 用VBA限制非注册软件使用时间 分值,就那么重要吗?大家来探讨一下! 请问如何用TC或BC或VC实现字符界面下文本阅读器(请尽快复) lemonade请进 请教水平考试 请赐教如何制作WINDOWS下的电子行程表(请尽快复) 号外!!号外!!谁能认真点回答我这个问题? 学了C和JAVA以后,我该学哪中语言? 这么晚了,还有谁在水园? 如何用JSP实现聊天是中的自动滚屏功能? 我的FlashGet,NetAnts全都没有办法下载了!!!急死我了!!! 探讨用专业论坛和新闻组来促销,那位兄弟有经验? 一个简单的问题,大家来看罗。 如何禁止EDIT控件输入? To:pbdesigner兄弟没找到解决的办法,只好修改程序流程避开这个问题8-( 小弟该如何学习? Actinia在吗?问你个问题! 今天又有人送分,he he! VC快玩完了!!!!改学BCB!!!! 一个简单的问题,关于cin的 怎样向listview发送消息? N人上班,按照白、夜、休三班倒,如何每月按此顺序自动排班 TreeView接点如何响应单击事件? 我的一本c++教程,刚刚下载了练习答案,不会用, 请问这是个什么东东问题?(只有这么多分了。。) 一张表内关键字如何互换? 本人想插入一个记录,但该记录的一个字段是一个已经输入的值,你说该用什么函数处理呀?本人想了一个早上也想不出个原因来!!!! 今天真热,一大早爬起来去游泳,感觉真好。这里有喜欢早晨去游泳的吗? DCOM问题。Win2000下的服务器应怎样配置,才能使客户机调用服务器端的DCOM。 再不帮我我就死定了 我要哭了! 痛苦:如果你的头儿叫你帮他修改他写的一大段垃圾代码,你会怎么做办? 工程为什么不能打包? 高手快来。 请问怎么安装PB 那有Acrobat下載,不是Acrobat Reader Foxpro的ODBC,是不是真的就不支持update当前游标的记录....? 怎么在SQLSERVER2K里用存储过程得到的完整的Xml文件,我想用jsp取出来? 关于ASP 能否将文件编译程序中。 请问大家用delphi都做过哪些软件呢?能否提供下载以便欣赏呢?(无源码也可) 这是怎么回事,前几天我用BCB作了一个特殊的窗体,为什么现在我一运行一个程序所出现的窗口就是那个特殊的窗口即便是刚起动起系统也这样为什么? 为什么VB6通过ODBC方式访问一些数据库表(如本地的SQL Anywhere5或服务器端的Sybase11.5)时,只能作查询操作,不能作修改删除操作? 请问:哪里有htmlhelp的使用资料啊? 基于对话框的MFC Application, 辅助线程负责串口通信,希望在完成一个块的交换后用一个消息通知主线程,怎么做? 蝈蝈! 搜索时总是得到这个: 想去泡吧,给点建议先... 用ADO如何判断一个表或视图是否存在?高分给出解决问题者! 我有一个好友想学VB 希望得到你的帮助 IE 自动刷新?? 反盗版话题太沉重,大家改用这个吧。 media encoder 的问题 英语翻译清朝以前.(不要用任何在线翻译 ) 英语翻译黑龙江省 依安县 西门里 建行综合楼 底商4号 英语翻译who can say where the road goes where the day flows only time and who can say if your love grows as your heart chose only time who can say why your heart sighs as your love flies only time and who can say why your heart cries when your lo 英语翻译从前,有一只小兔子.它有一支漂亮的铅笔.它把这支铅笔装在一个铅笔盒里.有一天,小兔子打开铅笔盒,发现铅笔不在了.它伤心的哭了起来.过了几天,小狗捡到了这支铅笔,并到处询问这 求大家帮忙把中文地址翻译成英文!谢谢啦!深圳市盐田区沙头角海景二路蓝郡广场海蓝4单元6楼E号麻烦有没有高手帮我翻译成英文地址,谢谢! 英语翻译麻烦朋友们帮忙翻译成中文!最好帮我分类好一句英文,后面就一句中文!歌名:the tower 歌手:vienna teng[00:02.00]vienna teng [00:08.00]the tower[00:12.00]the one who survives by making the lives [00:15.00]of other 英语翻译①我要两张往返车票.②他们正在设法修理它.③我们还在吃午饭,你吃过了吗?④我刚吃过午饭,半小时前吃的.⑤几天前,我把一只手提箱落在开往伦敦的火车上了. 英语翻译我要填写一份表格.但是在地址那一栏要写英文.有个地址不知道应该怎麼翻译啊.广州市北较场横路12号物资大厦 英语翻译Summer Days In Bloom Summer Days In Bloom Paralyzed by ancient delightAnd riding for a fall todayI am dressed in style,so eager in mindBut furthermore distracted by you And it's like I lose myself in dreaming of summer days in bloomOh,I'v 英语翻译对不起,二妹 我所做的一切很伤害你吧.你很恨我吧.但是我还是希望你能忘记我.我所做的一切 就是让你不在爱我.以后还有很多辉煌的人生等着你,而我只是在你人生路过而已,设置慢 英语翻译四川省成都市高新区天府大道天府软件园A7栋3层 英语翻译我给自己狗狗起了个名字叫 斯蓝~请问这个要是英文要怎么拼写,我自己觉得应该是 SLAN?...英文不好瞎琢磨的~最好写上读音 英语翻译临安自动化机电设备有限公司,临安市杨岱路33号翻译成英语怎么说?要正规的. 英语翻译石化木-------可仿真名贵木材、石化效果,纹理细腻、逼真高贵,任意造型、曲面、无接口(宽度1.2米以内),环保、防水、阻燃可达国家A级/欧盟VO级.生态石------可仿真名贵玉石,纹理细 有一首英语歌曲,叫什么“困难是朋友”大家知道吗 英语翻译公司名称:天美健国际健康科技(北京)有限公司天美健是公司名称,天美健能音译一个英文名称吗. 英语翻译工作年限:三年以上 手 机:xxxxxxxxxx居 住 地:苏州 电子邮件:xxxxxxxxx学 历:本科 专 业:工业与民用建筑 性 别:男 出生日期:1984年9月29日 目前年薪:4万人民币 户 口:南京 身 英语翻译作为样品免费寄出请翻译下, 英语翻译中文名称为:富平县百斯特绿色农业有限责任公司请帮我翻译一下,百思特应该翻成“baisite”还是“best”呢? 英语翻译自我评价自从步入社会我就把饱满的热情投入到工作中,并具有“干一行,爱一行”的敬业精神.现在我想换一个更有发展、更能提升自我的单位.我就是一匹千里马,执着地追寻着一位 英语翻译北京市劳动局9:00开门办公,咱们9:00在劳动局门口见面.劳动局开车到出入境大约需要三十分钟(如果不堵车的情况下).在出入境办理大约需要一个小时,因为有时候人多需要排队. 英语翻译公司名是 四川兴亿成智能消防设备有限公司 英语翻译白宫的基址是美国开国元勋、第一任总统乔治·华盛顿选定的,始建于1792年,1800年基本完工.有趣的是,第一位入主白宫的总统并不是第一任总统华盛顿,而是第二任总统约翰·亚当斯; 英语翻译我向大船公司了解过,此份文件可以于离开中国境内2天到10天内办理,不一定会有罚金.请贵司尽快办理,我们下次一定会改进, 英语翻译公司名字需要翻译成英文 :哲思文化传媒(北京)有限公司 ,直接翻译成Zhesi culture media (Beijing) Co.,Ltd.或者在线翻译了一下The philosophy of culture media (Beijing) Co.,Ltd.、 Philosophy culture medi 英语翻译自我技能简介我的主打菜肴是 广东菜 四川菜 东北菜为主会做烤鸭以及各种广式点心(水晶虾饺 灌汤蟹黄包…………………………………)擅长把中国菜融入到地方风味,对自助餐, 能把这首歌翻译成英文吗早知道 你只是飞鸟拥抱后 手中只剩下 羽毛当初你又何必浪费那么多咖啡和玫瑰 来打扰我想要 安静地思考天平上 让爱恨不再 动摇一想你就平衡不了我关灯还是关不 英语翻译广州市亚太华桑贸易发展有限公司 怎么翻译呢 英语翻译I am writing to check if you like to go further on me with my background information.I graduated from Eastern China Normal University in 85 with a BS in economics.then hold a teaching position in business school/Shanghai University for ab 英语翻译Please provide the below missing information by return.1 Type of ownership:Private/ Partnership/ Family Owned/ Publicly Owned/ Subsidiary/ Wholly Owned2 no.of worker:only 16 workers in factory?3.Financial Details:please fill in the estima 英语翻译中亚(天津)新材料科技有限公司要美观、准确,作为建筑前的铭牌装饰,全大写字应该怎样翻译美观, 英语翻译自我评价 熟悉计算机操作,熟练使用WINDOWS OFFICE办公软件.性格开朗、思维敏捷,善于总结分析.工作认真负责,且具备优秀的表达能力.适应能力强,很快可以融入环境,具有良好的团队协 英语翻译你需要我们印刷多少份目录? 英语翻译自己注册了一个公司明年开业,全称是“上海景承广告有限公司”,求大神帮我翻译一下全称.最主要的是景承怎么翻译比较上口,也符合西方特点及读法,易于记忆上口,没有歧义.比如百 上海世博会英文简介 翻译成中文The World Expo in 2010(2010年世博会) The World Expo in 2010 Shanghai will host the 2010 World Expo. The World Expo has a long history but it has never been held in Asia. So the 2010 World Expo 英语翻译 麻烦帮我翻译一下下面这些是什么 详细点 谢谢!Do not be angry pyronaridine Better North recurrence after such a big temper the I am afraid I am not good to you the benefits of gas My eyes, I slowly changed I rea 英语翻译河北国控金石矿业HeBei State Controlling JINSHI Mining Co,Ltd 金石是我们公司的名称 河北国控是我们总公司的名称 英语翻译• Taking charge of marketing promotion,establish effective communication with main construction companies in UAE.Planning and carrying out advertising and promotion resources.• Providing guideline to market support function,in 英语翻译1.Copy this link into your browser2.Offers a window pop up [This is to prevent spambots].3.Choose any mobile offering [do not worry about credit,see below].4.Complete mobile offers,you will be charged and password to unlock.5.After unlock 公司英文名称翻译公司名称: 技想科技 要求: 1、将技想转成英语 2、赋予新的含义也行 3、简短有力,意义丰富 4、通俗易懂,得体合意. 请给出名称,并注明解释 公司是电子行业,外贸为主. 注 英语翻译我的姓名是XXX,出生在广州!我的工作时设计排版!我的爱好是收藏,邮票,钱币,球星卡.最大的希望是开一间邮币卡店结交天下有收藏爱好的朋友!我的星座是双鱼座.性格有点双面,对着朋 英语翻译急阿,快 英语翻译公司名称:技想科技 要求:1、将技想转成英语 2、赋予新的含义也行 3、简短有力,意义丰富 4、通俗易懂,得体合意.请给出名称,公司是电子行业,外贸为主.注明含意, 英语翻译2007年10月-2011年10月 担任职位:跟单部主管及采购部主管 主要负责:制定及完善本部门的ISO程序文件,根据公司实情编制及优化工作流程主持采购部全面工作,认真监督检查各采购员 机械英语翻译,机械英语翻译,谁能帮我翻译一下下面这段,急!Integrated across the length of the cutting edges beingengaged, they result in the process force Fxyz against thetool rotation angle u.特别是这个the process force 和 英语翻译Food and cooking Bananas are eaten deep fried,baked in their skin in a split bamboo,or steamed in glutinous rice wrapped in a banana leaf.Bananas can be made into jam.Banana pancakes are popular amongst backpackers and other travelers in 个人简历翻译成英文,急、 英语翻译得CC上送芭蕾,得CC上送耍勒,得CC上送呜哦哦哦木哟芭蕾,得CC上吐网,得CC上送CK是,得CC上送A为王吐哇可低丝扣得.然后就是嘟嘟嘟嘟嘟嘟,嘟嘟嘟嘟嘟嘟,嘟嘟嘟嘟嘟嘟,嘟嘟嘟嘟嘟嘟.卡门 英语翻译let it be your reminder,if you still need one,that no one ever makes it alone.请帮忙分析句子结构并翻译一下, 英语翻译Databases are usually designed to manage large bodies of information.This involves definition of structures for information storage(data modeling),provision of mechanisms for the manipulation of information(file and systems structur 英语翻译我对你是认真的,这就是我的决心.请相信我,我会努力给你幸福.我会等你,等你戴上这枚戒指跟我说:“我愿意” 英语翻译Abstract:Jar tests were conducted to investigate the performance of enhanced primary treatment processes for low·concentra—tion municipal wastewater行om South China by using composite flocculant combined with bio.flocculants Pullu 麻烦大家帮忙把这段英文翻译成中文,谢谢了!China offers a good setting to test the relation between market institutions andaccounting properties because the levels of market development and governmentintervention vary significantly ac 关于朋友的英文歌就单纯的朋友的英文歌,不要什么爱情的,也不要那种说我们曾经是朋友的那种,就是两个人刚认识,交了个朋友~把歌词写上,还有歌词的中文版, 英语翻译周六周日不用上班,所以我想表达的意思是“周末这两天可以休息咯!”英文该怎么说好呢? 中文地址翻译成英文!帮帮我!贵州省黎平县第一中学高三八班 陈利蓉 收 邮编557300 求懂英语的朋友帮忙一下啊.英文歌曲西西音乐网的.http://www.ks321.com/play/6869.html 我很喜欢56分开始后面全部的英文歌曲,求懂英文的朋友帮我找出歌名,感激不尽.几首我曾在苏荷酒吧听过都非常 英语翻译“我想尽量让你觉得我过得很好,真的不用担心我,我会很开心的” 英语翻译北京市朝阳区壹线国际惠泽园10号楼1单元501室地址稍微有些变动:北京市朝阳区通惠家园惠泽园10号楼1单元501室把壹线国际改成通惠家园 唱给朋友的英文歌
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn