Delphi实现NetBIOS广播收发(2)

2008-04-09 04:18:31来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折



           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;

      end;

     ///////////广播消息处理过程/////

     procedure Tmain.post_main(var Message:TMessage);

      var

       x:integer;

       ret:UCHAR;

      begin

        file://取出数据缓冲区的内容

        for x:=0 to 511 do

         int_buffer[x+1]:=char_buffer[x];

         ////以下可以进行数据处理////

         file://重新打开异步接受

         ncbRock.ncb_post:=post_add;

         ncbRock.ncb_command:=$a3;

         ncbRock.ncb_event:=0;

         ncbRock.ncb_length:=512;

         ret:=netbiosSR(ncbRock);

        end;

      end.

  注:广播发送非常简单,不再详述。上述程序经过一年运行完全可靠。另外,经过改造可以将其改为LAN下的聊天程序。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:DELPHI超级Internet控件集--INDY

下一篇:Delphi数据压缩处理

IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设

网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源

网站联盟: 联盟新闻 联盟介绍 联盟点评 网赚技巧

行业资讯: 搜索引擎 网络游戏 电子商务 广告传媒

网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它

服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护

软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷

网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash

程序设计: Java技术 C/C++ VB delphi

网络知识: 网络协议 网络安全 网络管理 组网方案 Cisco技术

操作系统: Win2000 WinXP Win2003 Mac OS Linux FreeBSD

热门词条
最新资讯
热门关注
热门标签