大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> Delphi实现NetBIOS广播收发

Delphi实现NetBIOS广播收发

时间: 2021-07-31 作者:daque

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的delphi中偏巧没有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+}      file://证明一个ncb记载南针。      pncb=^ncb;     file://证明一个后处置例程的进程典型。      post=procedure(var ncbr:pncb);     file://以次是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;     file://证明本人的netbios因变量。教导2:确定要运用pascal挪用典型,要不,嘿嘿!!     function netbiossr(ncbx:pncb):uchar;pascal;     file://初始化ncb。      procedure initncb(var ncby:pncb);     file://后处置例程,提防运用远南针。      procedure postrout(var ncbr:pncb);stdcall;far;       var        char_buffer:array[0..511]of uchar;        int_buffer:array[1..512]of byte;       implementation        file://挪用体例的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; file://数据缓冲长度,最大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;           file://后处置例程的效率是当接受到播送动静时,登时向相映窗口发送动静。我在这边偷了点懒,以播送办法发送一个准时器动静。即使你承诺不妨向指定窗口发送自设置动静,如许要搀杂少许。  开始,要把指定窗口的句柄传播给后盾处置例程。常常这是做不到的,但不妨运用少许本领做到。在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}     file://动静处置进程,提防动静宏要与后处置中的普遍。     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;      file://取后处置例程的地方。      ncbrock.ncb_buffer:=@char_buffer; file://取数据缓冲区的地方。      initncb(ncbrock);      ret:=9;      ncbname:=random(100);      ncbrock.ncb_name[1]:=ncbname;      ncbrock.ncb_command:=$30;      file://加名,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; file://异步接受办法字。         ncbrock.ncb_event:=0;         ncbrock.ncb_length:=512;        ret:=netbiossr(ncbrock);        end;

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.