要做一个实时网络流量监控功能的东西。经人介绍,用GetIfTable和GetIfEntry来获得MIB中的数据。
我是这样写的:
MIB_IFTABLE* ifTable = new MIB_IFTABLE[6]; 
MIB_IFROW ifMib;
unsigned long dwSize = sizeof(MIB_IFTABLE);
GetIfTable(ifTable, &dwSize, true);        
ifMib.dwIndex = ifTable->table[6].dwIndex ; 
GetIfEntry(&ifMib);       
然后,MSDN说数据就存放在ifMib中了。
我查看了MIB_IFROW的结构,发现dwInOctets和dwOutOctets
好像是记录流入/流出适配器的字节数。但是,我发现这两个数据中是异常:
在没有网络流量时,他会有一个很大的数值,如:1074182638等
而我在下载文件时,有时会为0!所以,我想问问各位:
这里的数据是瞬时值,还是总值?
dwInOctets、dwOutOctets、dwSpeed等变量的具体含义是什么?
如果我要得到向WinXP里的“任务管理器”->“联网”中一样
实现流量曲线的话,应该读那个变量的数据?
还是要用别的方法?谢谢了!!!

解决方案 »

  1.   

    我怎么在MSDN里找不到GetIfTable和GetIfEntry。
    是.net的东东?
      

  2.   

    我用的是:MSDN Library - April 2001在“索引”中查就可以了。
      

  3.   

    100分的问题我喜欢.第一,回答你的问题.  在SNMP协议中说明, IfInOctets, IfOutOctets 是counter, 而IfSpeed是gauge.  什么意思呢? 也就是说前两者是代表累加值,后者是一个测量值.       dwOutOctets, dwInOutOctets表示从上一次计数开始到当前的in/out流量总和. 注意, dword能表示的范围有限,所以,当累加值超出这个上限后,数值看起来好像是又从零开始了.     IfSpeed表示接口当前速率,bits/s,是一个测量值. 对于一些不支持这种测量的接口,ifspeed表是该接口的标称带宽.
         相关资料可以参考SNMP的东西.如 rfc第二. getiftable()已经得到了接口的所有数据, 不用再调用getifentry().
    第三, MIB_IFTABLE* ifTable = new MIB_IFTABLE[6]; 
          你能确定接口数再6个以下??这种用法使程序通用性变差.
      

  4.   

    To Gargamel(格格巫):
    首先,谢谢你的回答。
    1.
    我又试了一下,发现他无论在有没有数据时,
    都是一个很大的“常数”--1999707468。
    因为我每秒循环一次读取数据,
    这难道表示我的下载速度是1.9GB/s???
    这显然不可能。为什么???另外,那里有关于SNMP或rfc的资料?
    (最好是网上免费的)2.
    我无论是否调用getifentry都有以上的结果,
    似乎getiftable就可以了。3.
    我不确定这里所说的接口的定义。
    他是否等价于网卡/网络适配器的数量?
    我应该在此基础上做一些什么样的修改?谢谢,解决了问题,一定给分。
      

  5.   

    2. GetIfEntry()是取一个特定Index接口的信息。
       GetIfTable()  是取本机所有接口的信息。
       调用了后者当然不用再调用前者了。
       一般地,不考虑速度,调用这种需要未知缓冲区大小的函数是这样作的:
      例如:
        PMIB_IFTABLE  pIf         = NULL;
        DWORD         dwIfBufSize = 0;
        BOOL          bRet;
        
        bRet = ::GetIfTable( pIf, &dwIfBufSize, TRUE );
        if ( bRet == ERROR_INSUFFICIENT_BUFFER )
        {
            if( pIf != NULL )
                delete[] pIf;
            pIf = ( MIB_IFTABLE * ) new char[dwIfBufSize];
            bRet = ::GetIfTable( pIf, &dwIfBufSize, TRUE );
        }
            .........................3. 这里所说的接口不仅指网络适配器(以太网、令牌环。),还可能包括串口、本地回环等一切将本机连接到“subnet"的接口。(这里的子网可以是逻辑上的。)1. 你说那个2G的东西是dwSpeed的数值吧。rfc1213中这样解释IfSpeed:
    "An estimate of the interface's current bandwidth in bits per second.  For interfaces which do not vary in bandwidth or for those where no accurate estimation can be made, this object should contain
     the nominal bandwidth."  所以说明该接口的速率(带宽)是恒定值,标称带宽2Gbps.(光纤?)4.  rfc到处都有,你在google或天网上搜一下,会有很多。最权威的地方是
     www.ietf.org 然后找相关链接5. 对于接口自己本身来说,当前速率是无意的。只有一个统计平均值。如bits per second。 你要想显示“当前速率”,可以每1秒或几秒取一次in/out octets的值, 两次的差值除以时间间隔得出。注意,如果后一次取得的值小于前一次,说明dword已经超出表示范围过,得把后一次作一下处理再用。
    还有问题吗
      

  6.   

    异常数值大概是结构没有初始化的关系,
    在new后,最好memset(ifMib,0,sizeof(MIB_IFROW));
      

  7.   

    和初始化没有什么关体。系统会按struct的item类型全部添满buffer的。
    更何况,他那根没就没什么异常。
    楼主呢?说说看,你的机器都有哪些接口?
      

  8.   

    都是一些标准接口:
    主板上有6个PCI插槽(所以用6,因为觉得其他机也不会太多)
    PCI网卡两张(RTL8029AS/10M、RTL8139/100M),
    PCI猫一只,没有串口设备,其他的都是常见的。另外,在之前提到的“常数”--1999707468
    不是IfSpeed,而是dwInOctets!!!
    正是因为这样,所以我才觉得有问题。
      

  9.   

    dwInOctets和dwOutOctets都表示的是累加值而不是当前瞬时值。
    这个常数你每次调用都是这么多吗?是其中一块网卡还是两块都是这样?你的两块网卡都实际在用吗?把你的信箱给我,我可以把我昨天验证的小程序给你试试
      

  10.   

    问题解决了。一开始,Gargamel(格格巫)的程序也编译不通过。
    后来,升级了SDK后,就都没事了,
    原来是SDK的问题,真没想到啊!!!好了,结帖。最后,谢谢Gargamel(格格巫)的帮助!!!
      

  11.   

    奇怪!!!我在“管理”窗口中,
    明明看到我给了Gargamel(格格巫) 100分,但在这里怎么没有分???