我打算用D6做一个远程的监视系统,请高手出招,给我一个方案!200分(200分)

  • 主题发起人 主题发起人 Dephic
  • 开始时间 开始时间
D

Dephic

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器:
1:监视系统:
(1)监控:
当客户机连接Internet,从客户机单端取得该机系统信息(包括公司
名称,用户名称等信息)以及在Internet 中的动态IP,并进行存档!并在服
务器上显示所有上网的机器的信息,实现在线监视功能!并统计数据!
(2)向客户广播传递消息(类似QQ的广播功能)
2:客户升级包:
通过客户端申请升级,实现在线安装!
客户端:
(1)客户端在连接Internet时,自动跟服务器建立连接,
(2)网站导航:
使用客户常用链接地址,引导用户进行资料查询
(3)升级程序
在服务器下载后,自动安装!

现在的问题是:用什么实现比较好?TCP/IP or UDP or other?
如何实现希望得到有价值的东西!欢迎讨论!
 
TServerSocket和TClientSocket
 
》honestman 用TServerSocket和TClientSocket可以实现广播吗?
 
可以用netbios广播
 
如果要广播就要用UDP啦!!!
 
好,谢谢honestman,
欢迎继续讨论!
 
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的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;
      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下的聊天程序。

2001-04-10· 余六 ·天极论坛
http://www.yesky.com/34669921/168842.shtml
 
但客户机不在同一局域网,也不一定在同一网段,通过internet通信!
而且客户会不断增多!
 
类似OICQ的东西???
 
不是,只有广播功能和OICQ类似!
我想做的这个东西并不用提供聊天功能!
只是为了方便我们的客户,如果公司有什么事情,可以广播通知客户!
以及对客户调查,能够监视哪个客户在线用我们的宽带!
 
谁能告诉我?
 
UDP较好。Delphi6中新增的Indy系列空件就很好!!而且能在kylix下用!

 
你是不是要使用 数据库 呢?
 
各位大虾,大家好:
我们单位的计算机要处理一个这样的数据库,它只有两个字段,一个是学生的学号,
另一个是存放照片的通用型字段zp,现在我想把每个学生的照片放到该字段中,现在我
知道可以FOXPRO中通过双击该字段把照片插入,但现在的学生有一千多个,我是不是
需要每个照片都这样做呢?这不是太麻烦了吗,我该如何处理这个工作呢?可以节省
我的操作时间与精力。请大家快快帮帮我。
我出一百分的。一定。
如果大家知道此问题的处理方法要很快通知我呀。
谢谢大家。
小虫:志在DELPHI。
2001/6/21
 
现在我把问题缩小一下,如何用NMUDP实现广播?
 
是这样的:
硬设备:
服务器是有固定合法IP,但客户端是通过局域网使用sygate之类的软件和internet 接通!
要实现:
服务器对各客户端广播!问题是客户端的IP是虚IP,如何才能广播呢?
谢谢各位大虾了!
 
后退
顶部