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

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

里程碑:iPhone与Android企业用户市场首次超过黑莓 VMware最快下周宣布分拆Cloud Foundry 国际原子能机构服务器遭窃 百多位专家信息泄密 用户可通过Google Drive直接向Gmail添加高达10GB的文件 韩寒携个人App进军移动互联网 亮相应用汇独家发布会 摆脱谷歌 亚马逊向开发者正式发布地图API 为什么应该用模块取代C/C++中的头文件? Mozilla布道师:HTML5在移动端没有未来? 那些年,历史上留下浓重一笔的黑客们 林敏博士:透过设计看三星手机帝国崛起 OpenFeint血泪史:我们是如何被苹果逼死的 或免费升级:微软2013年推Windows Blue系统 取经:《捕鱼达人2》每月捞金160万美元的秘密 AWS推数据仓库服务Redshift 价格仅是Teradata IBM Oracle的十分之一 美国开展数据中心整合计划 简化政府IT运营 阿里巴巴数据交换平台——集大成于一身 [体验]Windows 8 Metro/Modern Style IE 10 Growth Hacker正席卷全球,你了解它吗? Splashtop发布Ubuntu Linux版本Streamer 性能超过VNC 10倍 Windows 8引领智能操作 人机交互进入触控时代 豌豆荚发布新版应用搜索 推出“绿色标签”机制 权威解读:苹果的未来将走向何方? Google炮轰Facebook:你们的社交已经过时了! iOS设备硬件规格完整汇总 2012 MDCC“2012移动互联网应用创新大赛与开发者面对面”专场:创所未享,携手逐梦! RIM携QNX为“2012 BlackBerry平台移动应用高校竞赛” 颁奖 BlackBerry 10 策略:用金钱吸引游戏开发者 黑莓10要来了:RIM正式开放应用提交 从RIM与微软达成exFAT授权所想到的 OpenStack中国行来到南京 中兴通讯分享电信行业应用 CSS架构目标:预测、重用、扩展、维护 请教群集服务器上数据库的连接问题 关于拷贝构造函数的问题!! 二两乾天只手擎,谁想到对得上的吗? 在一Bean中,我返回一ResultSet,那么在bean中无法关闭数据库连接了,该怎么办? 继承了TComboBox的WndProc后无法截获WM_CHAR消息为什么? ReleaseDC和DeleteDC有什么区别? TNMFTP编程下载时出现:socket send aborted请指教! 客户端用java,数据库为oracle,如oracle设置为某一字符集,此时在java中得到的字符是什么字符集? ★★★ASP页面奇慢无比,Html很正常。大家救救我吧!★★★ 哪位知道用VB或VC实现WAV转成VOX的控件或源程序,或者是直接录音成VOX文件 有个小程序,我出钱,谁想做? rs.close 与rs=nothing 有什么区别,应该怎样用比较好!! Outlook中便笺字体的设置问题 请问那里有.net的教程下载? delphi6中 Corba data object 中怎么用ado呢? 为什么总不行? 如何在pb中实现控制datawindow每页的打印条数? 哪位知道用VB或VC实现WAV转成VOX的控件或源程序,或者是直接录音成VOX文件 请教高手!恳请指点! 我有个小程序,我出钱,谁有兴趣做下? listview中如何得到当前鼠标所在位置的单元格内容 TRxtrayIcon控件,我搜索了多个地方,可一直没有在dephi上用的,那位有!! Unicode CreateCompatibleDC创建兼容的设备描述表有什么本质的用途? 好久没来了,不知说什么好! 请教:装ORACLE的分区所剩空间太小,能不能让新建的数据库文件保存在别的磁盘分区? 怎样加密文件和文件夹?很急!!! 如何实现StringGrid只有一列为编辑状态,其它列为只读? ClientDataSet执行关闭,为什么还会执行BeforeGetRecords事件呢? 如何实现将bmp图进行缩放,不要显示在屏幕上,但要存储到硬盘。急!!谢谢! 那有vs6下载? 可分割窗体 如何把TADODATASET转换成IDispatch类型 转换类型 COM的问题(新手) 如何应用ASF Reader Filter? 关于接收windows消息的问题 java程序移植到linux下中文字体变成??||之类的,怎么解决 怎么近来CSDN上的N多历史帖子都看不了了 ? 如何获取汉字的拼音码? 有没有记录DBGrid的当前位置的,我说的不是用bookmark,因为我的DataSet是动态建立的,在刷新时好象Bookmark用不了。 英文cuteftp为何中文显示为乱码? 汉化cuteftp却显示英文为乱码? 这个问题真头疼! 在XML中,如何显示一个图像 编程菜鸟急急急——关于autocad的一个插件!! winxp家庭版中是否有IIS,有的话在哪里安装,我在添加windows组件中怎么找不到?在线! js中有没有类似php中的basename 和 explode 方法 hook 问题? help,我一哥们光荣下岗,有做java项目又缺pm的请帮忙 简单问题,怎么才能把这个函数的返回值转换成字符串放在一edit1.text中。50分 关于控制窗口的问题! 如何关闭数据库连接? 救命!!WINDOWS启动错误 一批产品经检验,合格的有792个,不合格的数量占合格的99分之1,这批产品的合格率是( )% 一道关于动量的物理题甲车质量2kg,静止在光滑水平面上,上表面光滑,右端放一个质量1kg的小物体,乙车质量4kg,以5m/s的速度向左运动,与甲车相碰后甲获得8m/s的速度,物体滑到乙车上,若乙车足够 净水器每天的出水量是多少? 一批产品,经检验合格的有99件,不合格的占合格的1/99.这批产品的合格率是多少? 一道关于物理动量的题光滑的水平面上有质量为M的滑块,其中AB部分为光滑的1/4圆周,半径为r,BC水平但不光滑,长为L.一可视为质点的质量为m的物块,从A点由静止释放,最后滑到C点静止,求物块与B 消化液不流入小肠的是 A胃液 B胆汁 C胰液 D肠液 一批产品,经检验合格的有198件,不合格的占合格的1/99.这批产品的合格率是多少?要算式 一道物理题(有关动量)质量为m的物体,初速极小,在外力作用下从原点起沿x轴正向运动.所受外力方向沿x轴正向,大小为F=kx.物体从原点运动到坐标为x0的点的过程中所受外力冲量的大小为_ 一辆汽车车轮的直径是1.5米,如果汽车车轮平均每分钟转200周,要行9420米的路程,需要几分钟 一类产品,经检验合格的有190件,不合格的占合格的1/99,这批产品的合格率 写一篇有关京剧的小论文内容有关 看大王在帐中和衣睡稳(霸王别姬选段)海岛冰轮初转腾(贵妃醉酒)雄心壮志冲云天(红灯记)家住安源(杜鹃山)写下这些京剧的内容,再写这些京剧 一些球分给五年级个班,每班3个多3个,每班5个差2个,一共有多少个球、 黑板尺寸有哪些?标准尺寸多少合适? 有关京剧的作文 一台饮水机原价450元,提价20%后又降价30%,现在售价多少元?,这题怎么写 黑板的尺寸大概是多少? 韩麦尔先生使出全身的力量,在黑板上写下了“法兰西万岁”表现了他怎样的思想感情? 一台饮水机,降价十分之一后是648元,原价是多少 填适合的单位,黑板的大小约有250【】 动量与能量的综合问题A球动量5kg.m/s,B的是7,当A球追上B球时,发生对心碰撞,则碰后动能可能为?A.PA=6kg.m/s,PB=6kg.m/s,B.3,9C.-2,14D.-5,17不好意思,打错了,则碰后动量可能为? 一台饮水机降价1/10后是216元,原价是多少元? 物理动量与能量在光滑水平面上停放一辆小车,小车上固定一个半球壳,小车左面是墙壁,小球从半球壳左端与半径等高处由静止释放,小球与球壳之间光滑无摩擦.(1)如果没有墙壁,小球与球壳 动量与能量问题如图所示,质量为M=1Kg,长为L=2.25m的小车B静止在光滑水平面上,小车B的右端距离墙壁S0=1m,小物体A与B之间的滑动摩擦系数为μ=0.2.今使质量m=3Kg的小物体A(可视为质点)小物体以 【饮水机专用盐】饮水机专用盐批发,饮水机专用盐厂家,北京饮水机专用盐,饮水机饮水机专用盐,那里价格 填适合的单位,黑板的大小约有250什么 动量与能量的问题有着样一道题:有一质量为m子弹以v的速度水平射出.穿过放在光滑的水平桌面上的质量为M的木块后.子弹速度变为v/2求在此过程子弹损失的机械能?着怎么解答`?损失的机械能 【饮水机用盐】【饮水机专用盐】饮水机用盐批发,饮水机用盐厂家,北京饮水机用盐,饮水机用盐价格,找谁谁知道 求一篇题目《我与京剧》的作文 字数400——600(要原创!) 以京剧为话题的作文不要记叙文,像散文这样的 一辆汽车的轮胎外直径是1.02米,如果车轮平均每分钟转300周,那么这辆车1小时前进多少米? 京剧作文? 一杯水中放入10克糖,再加入浓度为5%的糖水200克,配成浓度为20%的糖水,问原来杯中有水多少克? 轮胎的外直径是0.8米,车轮平均每分钟转350周,这辆汽车1.5小时可以行驶多少千米?我要算式谢谢你们 关于 京剧 的作文及介绍因为从来没看过, 一杯水中放入10克糖,再倒入尝试为5%的糖水200克,配成溶液为2%的糖水,问原来杯中有多少水? 一批产品检验时不合格的有80台,合格产品200台,合格率是多少? 如图所示,质量均为m的两块完全相同的木块A、B,放在一段粗糙程度相同的水平地面上,木块A、B间夹有一小块炸药(炸药的质量可以忽略不计).让A、B以初速度v0一起从O点滑出,滑行一段距离后 一杯水中放入10克糖,再加入浓度5%的糖水200克.配成浓度为2.5%的糖水,问原来1杯中有水多少克 指出句子的描写手法,并分析其作用他转身对着黑板,拿起一支粉笔,使出全身的力气按着粉笔,用最大的字母写出;法兰西万岁 绳子模型在光滑水平面上,有两个玩具小车A和B,它们的质量分别为mA=3Kg,mB=6Kg,它们之间有一根轻绳连接,开始时绳子完全松弛,两车紧靠在一起,如图所示,用3牛顿的水平恒力F拉车B,使B先动起来,绳 小丽与小明从同一个地点同时相背而行,小丽每分钟走40米,经过三分钟后小丽与小明相距270米,小明每分钟多少米?小丽与小明两人从相距310米的两地走来,小丽每分钟走40米小丽先走1分钟.小明 某厂检验一批产品,有a件合格,b件不合格,合格率是? 普通教室里的黑板的面积约是?A.4米^2 B.40分米^2 C.4000厘米^2 D.40米 ^2 从同一个地点同时相向而行小丽每分钟走40米经过三分钟后小丽在小明后面30米求小明每分钟走多少米(列式) "他转身朝着黑板,拿起一支粉笔,使出全身的力量"品味该句中的全身 高中物理-------动量与能量守恒如下图所示是固定在水平地面上的光滑长直导轨槽,槽口向上(图为俯视图).槽内放置一个木质滑块,滑块的左半部是半径为R的半圆柱形光滑凹槽,木质滑块的宽 跟京剧有关的作文,600字左右要写出历史发展概况和基本特点,要做到条理清楚,言简意明. 一批产品经检验,合格的有100个,不合格的有2个,合格率是多少? 教室黑板长约多少厘米? 100加仑的纯水机配什么样的增压泵呀? 平板B和球C原来静止在光滑的水平面上,两者之间的距离x=0.04m,小滑块A以大小v=2.4m/s的初速度向右滑上平板.已知A、B、C三者质量相同.A、B间的动摩擦因数为0.20.已知平板B和球C发生碰撞时速度立 关于动量质量为1kg的小钢球B静止在光滑水平面上,质量为2kg的钢球A以1m/s的速度与B发生正碰,求碰后A、B两球的总动能的取值范围.我知道最大值是1J,可是最小值怎么算? 谁知道各种净水器的出水量是多少超滤机.RO机,中央净水器,厨房净水器的出水量分别是多少 对于被运动员踢出的在水平草地上运动的足球它受几个力的作用?(除重力外) 一道物理动量题两质量均为M的冰船A,B静止在光滑冰面上,轴线在一条直线上,船头相对,质量为m的人从A船跳入B船又立刻跳回.A,B两船最后的速度之比是? 哪家的“ 净水器” 的产水量好?本人想买一台产水量大的“ 净水器” ,有哪位朋友能告诉我. 物理题有关动量能量用一根细线吊一重物,重物质量为5 kg,重物下面再系一根同样的细线,细线只能经受70 N的拉力.现在突然向下拉一下下面的线.设力最大值为50 N,问两根线能否被拉断! 一种产品经检验合格92件,不合格8件,该产品的合格率是【 】%填空题 一道有关动量的物理题在光滑的水平支撑面上,有A,B两个小球,A球的动量是10千克米每秒,B球的动量是12千克米每秒,A球追上B球并相碰,A的动量变为8千克米每秒,方向没变,则A,B两球的质量的比值 纯水机的额定总制水量是什么意思
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘