六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

Delphi完成NetBIOS廣播收發(fā)

[摘要]NetBIOS網(wǎng)絡協(xié)議對于很多讀者來說可能比較陌生,但其實它是由IBM開發(fā)的一個很古老的協(xié)議,當年在LAN上也風光一時。說它老,其實也不過10年光景,IT業(yè)的發(fā)展實在是太快。由于NetBIOS不具備路由功能,也就是說它的數(shù)據(jù)包無法跨網(wǎng)段傳輸,因此在廣域網(wǎng)、城域網(wǎng)大行其道的今天,它已退居配角。如果你...
NetBIOS網(wǎng)絡協(xié)議對于很多讀者來說可能比較陌生,但其實它是由IBM開發(fā)的一個很古老的協(xié)議,當年在LAN上也風光一時。說它老,其實也不過10年光景,IT業(yè)的發(fā)展實在是太快。由于NetBIOS不具備路由功能,也就是說它的數(shù)據(jù)包無法跨網(wǎng)段傳輸,因此在廣域網(wǎng)、城域網(wǎng)大行其道的今天,它已退居配角。如果你有心的話,能夠發(fā)現(xiàn)在Window95 / 98的網(wǎng)絡協(xié)議中仍然保留著NetBIOS,不過它已經(jīng)改名叫NetBEUI(NetBIOS擴展用戶接口),是NetBIOS的Microsoft改進版。另外在TCP/IP以及IPX/SPX協(xié)議中,也依然保留了對NetBIOS的支持,只要查看網(wǎng)絡協(xié)議屬性中的高級,就能看到啟用NetBIOS的選項。

  之所以這樣是有原因的。NetBIOS協(xié)議短小精悍,非常適用于小型局域網(wǎng),特別是一些對實時性要求較高的網(wǎng)絡環(huán)境。NetBIOS的廣播功能由于有開發(fā)使用方便、系統(tǒng)開銷小的優(yōu)點,所以在很多場合仍然被大量使用。筆者由于工作需要,在一個航天測控軟件的編制中就使用了NetBIOS廣播功能。

  我原以為這是件很簡單的工作,因為WIN32API中提供了一個Netbios函數(shù),里面封裝了所有函數(shù)和數(shù)據(jù)結構,用起來很方便,在BC和VC下都如此。可是由于這次是使用流行的Delphi作編譯器,卻遇到了意想不到的麻煩:號稱全面移植WIN32API的Delphi中偏偏沒有Netbios函數(shù)!這下頓時讓我方寸大亂。怎么辦?總不能從底層干起吧?而且時間也不允許。在冷靜下來之后,我忽然想到,既然WIN95支持NetBIOS,那么系統(tǒng)就一定會提供DLL支持,編譯器本身是沒有底層支持的。于是我在機器中搜索,果然,在SYSTEM目錄下有一個Netbios.dll,用快速查看將其打開,在導出表部分顯示如下:

  導出表:

序數(shù) 入口 名稱
0000 00001a37 NetbiosAddthd
0001 000019eb NetbiosDelete
0002 00001a96 NetbiosDelthd
0003 000019b1 NetbiosInitialize
0004 0000186b PostRoutineCaller
0005 0000102e _Netbios

        
   注意到那個0005號_Netbios導出函數(shù)了嗎?那就是我需要的!經(jīng)過緊張的試驗調(diào)試,證明它和WIN32API手冊上的Netbios完全一樣。剩下的工作就比較簡單了,定義一個NCB(Netbios控制塊)記錄,將NCB數(shù)據(jù)結構封裝在里面;聲明一個后處理例程以及消息處理過程,以完成廣播數(shù)據(jù)的接收和發(fā)送。有關NCB數(shù)據(jù)結構的詳細內(nèi)容以及NetBIOS廣播的原理,限于篇幅我就省略了。需要的朋友可以查看BC或VC的Help或相關書籍。下面是有關的Delphi源代碼。

/////////Netbios單元///////////

  unit netbios;

  interface


   uses windows,messages,F(xiàn)orms,SysUtils;

    type

     {$X+}{$A+}

      file://聲明一個NCB記錄指針。


      PNCB=^NCB;

     file://聲明一個后處理例程的過程類型。

      POST=procedure(var ncbR:PNCB);

     file://以下是NCB記錄,教訓1:將上面的編譯選項置為{$A+}以取消數(shù)據(jù)對齊。如果在廣播中有浮點數(shù)的話,數(shù)據(jù)對齊會讓你大吃苦頭!我已經(jīng)有過慘痛教訓!:(

      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函數(shù)。教訓2:一定要使用pascal調(diào)用規(guī)范,否則,嘿嘿!!

     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://調(diào)用系統(tǒng)的Netbios。dll中的Netbios函數(shù)標號是6。Delphi搜索外部文件的順序是當前目錄→系統(tǒng)目錄→其他目錄,別忘了保證存在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://數(shù)據(jù)緩沖長度,最大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://后處理例程的作用是當接收到廣播消息時,立即向相應窗口發(fā)送消息。我在這里偷了點懶,以廣播方式發(fā)送一個定時器消息。如果你愿意可以向指定窗口發(fā)送自定義消息,這樣要復雜一些。

  首先,要把指定窗口的句柄傳遞給后臺處理例程。通常這是做不到的,但可以利用一些技巧做到。在NCB記錄后面緊挨著聲明一個句柄類型,然后把指定窗口的句柄賦值給它的實例變量;這樣句柄變量的地址與NCB是連續(xù)的。在后處理中通過指針或匯編語句將ncbR的地址移到最后一個字節(jié)+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,F(xiàn)orms,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://取數(shù)據(jù)緩沖區(qū)的地址。

      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(‘網(wǎng)絡通信無法實現(xiàn)!您需要關閉程序重新運行.'',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;


主站蜘蛛池模板: 中文字幕在线天堂 | 四虎成人免费大片在线 | 欧美一级片手机在线观看 | 青青草华人| 午夜影院免费视频 | 亚洲免费网站 | 青草草在线观看免费视频 | 天天看天天摸色天天综合网 | 日本一区二区视频在线观看 | 日本欧美视频在线观看 | 日韩免费一区二区三区在线 | 亚洲男人的天堂网站 | 日韩色图区 | 午夜高清在线观看免费6 | 亚洲免费高清视频 | 在线香蕉 | 午夜男人网 | 亚洲伊人久久大香线蕉结合 | 天天躁日日2018躁狠狠躁 | 欧美亚洲另类一区中文字幕 | 日本国产一区在线观看 | 亚洲产国偷v产偷v自拍涩爱 | 四虎久久影院 | 日本爱爱视频 | 欧美亚洲国产精品久久久久 | 青草久久网 | 日韩系列 | 中文天堂| 亚洲欧洲国产精品久久 | 庆余年第二部在线观看免费完整版 | 天天视频网 | 日韩免费在线视频 | 天天噜夜夜操 | 香蕉国产成版人视频在线观看 | 日本高清在线观看视频你懂的 | 中文字幕11页 | 日韩欧美中文在线 | 日韩成人免费在线 | 香蕉网站狼人久久五月亭亭 | 亚洲欧美a | 日韩视频中文字幕专区 |