如何利用VC获得网络主机或服务器的CPU和内存使用率?就象任务管理器那样。要遵循SNMP,最好有代码示例,谢谢,急!!!

解决方案 »

  1.   

    先一下,明天帮你找找看不过获得CPU和内存使用率的好像没有,获得别的情况的代码倒是有估计原理差不多的^_^
      

  2.   

    SNMP没用过,不过你到可以用PDH函数获得主机的的CPU和内存使用率,然后再下载到本地,也就是说server端要有个程序
      

  3.   

    这里有一些snmp协议的几个例子,楼主可以参考一下http://www.vckbase.com/code/listcode.asp?mclsid=9&sclsid=917
      

  4.   

    该函数得到内存绝大多数信息  
    BOOL  GetProcessMemoryInfo(  
       HANDLE  Process,                        //  handle  to  process  
       PPROCESS_MEMORY_COUNTERS  ppsmemCounters,  //  buffer  
       DWORD  cb                       //  size  of  buffer  
    );
      

  5.   

    晕哦,楼主说的是Snmp. 而不是本机的信息。我在win2000下试过的,可以获得CPU,硬盘和每个进程的相关信息。
    下了班回去给你找找这些OID。
      

  6.   

    搂住也搞这个啊,我前段时间也在做这方面的事,现在已经暂时告一段落了。
    你这个想法当时我也有过,可是我在RFC1213 ,1157这两个相关SNMP MIB中都没有找到有这些OID的定义。我记得好像这些定义是windows的一种扩展mib。但我一直没有找到。后来我是用agent的方式在本地获取这些信息然后发往管理程序的。当然这种办法不是最佳,因为和程序的整体设计不是很好的结合。还有想请问一下搂主,你做过Set的操作吗,我Get时都是成功的,但在Set同样的OID(可读写)时却返回一个没有这样的OID的错误。
      

  7.   

    看下面的OID,我只保证win2000下有效。        oidarray[0] := '1.3.6.1.2.1.25.5.1.1.1';
        oidarray[1] := '1.3.6.1.2.1.25.5.1.1.2';
        FGetTable.SendSnmp(edtCommunity.Text,
                           IntToStr(edtIP.ip1)+'.'+IntToStr(edtIP.ip2)+'.'+
                           IntToStr(edtIP.ip3)+'.'+IntToStr(edtIP.ip4),
                           oidarray,20);
        oidarray := nil;
        StatusBar.Panels.Items[0].Text :=('采集服务器的CPU,内存信息...');
        oidarray[1] := '1.3.6.1.2.1.25.2.3.1.4';
        oidarray[2] := '1.3.6.1.2.1.25.2.3.1.5';
        oidarray[3] := '1.3.6.1.2.1.25.2.3.1.6';
        FGetTable.SendSnmp(edtCommunity.Text,
                           IntToStr(edtIP.ip1)+'.'+IntToStr(edtIP.ip2)+'.'+
                           IntToStr(edtIP.ip3)+'.'+IntToStr(edtIP.ip4),
                           oidarray,20);
        oidarray := nil;
        StatusBar.Panels.Items[0].Text :=('采集服务器的硬盘信息...');
      

  8.   

    TO dash:请问你上面的OID是在哪个文档中查到的?能告知吗?谢谢!
      

  9.   

    楼上的怎么不来了啊,不会是连这个RFC也要保密吧
      

  10.   

    win好像自带了一个SNMP服务器和一些API,不过你也可以自己写SNMP服务器来实现。这样都可以自定义了。
      

  11.   

    而且你不能保证目标机器已经开了这样的SNMP服务器。最保险的还是自己写一个SNMP服务器(直接用开发包)
      

  12.   

    TO:sevencat(七猫):
      呵呵,今天长见识了,还能自己写SNMP服务器啊,我以前一般都是要求目标机器装SNMP服务并开启这个服务,然后通过那些API函数去获取客户机上相应的信息,如果自己写SNMP服务,怎么搞啊,这个我可是空白,你有相关的例子或者代码吗?还有这个自己写得SNMP服务应该需要安装到客户机上的吧?
      

  13.   

    我的那块代码是刚毕业时候写的,没有商用。
    那些OID好像也不是在某RFC上看到的,而是来自某网站的资料吧。你自己在找找吧。sevencat(七猫) 说的(包括TRAP吧),也是可行的 。不过我没有试过。
      

  14.   

    我可以替 dash解释一下他说的OID。这个是25号HOST协议组1.3.6.1.2.1.25,一般pc都会支持,如果大家有mib浏览去的话可以看到;有兴趣的话,可以查看RFC1514
    ps:实际上,我已经得到了dash提到的这些参数,就像上面我提到的我可以获得每个进程占用的内存和cpu消耗时间,可是还是不知道怎么样计算系统cpu和内存利用率
    ……请大家踊跃发言吧,呵呵!
      

  15.   

    代码不在身边,凭印象说。我记得是可以取到每个进程的CPU时间的。而由CPU时间怎么获得CPU使用率呢??
    注意有个IDLE PROCESS, 该进程的CPU占用时间的变化率就是CPU的空闲率。
    比如1秒时间内,如果该进程的CPU时间只增加了半秒,就可以认为是50%。
    呵呵,我记得当时我就是这么做的。当然,这个做法是自己琢磨的。未有官方的文档证明。期待有更完美的方法。
      

  16.   

    snmp服务器?就是agent吧!太多了.
      

  17.   

    以前我下载过一个netsnmp开发包的,编译就花了我好长时间,后来还是用的公司自己开发的一个sdk
      

  18.   

    用agent++做一个snmp的扩展dll也比较方便。独立的exe也不是很难。
      

  19.   

    HOST-RESOURCES-MIB:hrProcessorLoad.2OID  1.3.6.1.2.1.25.3.3.1.2.2
    Type  INTEGER
    Units  % load
    Access  read-only
    Status  unknownThe average , over the last minute , of the percentage of time that this processor was not idle.
    用这个就可以得到cpu的利用率了!HOST-RESOURCES-MIB:hrSWRunPerfMemOID  1.3.6.1.2.1.25.5.1.1.2
    Type  KBytes
    Units  K bytes
    Access  read-only
    Status  unknownThe total amount of real system memory allocated to this process.
    可以得到每个进程消耗的内存!