要做一个实时网络流量监控功能的东西。经人介绍,用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里的“任务管理器”->“联网”中一样
实现流量曲线的话,应该读那个变量的数据?
还是要用别的方法?谢谢了!!!
我是这样写的:
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里的“任务管理器”->“联网”中一样
实现流量曲线的话,应该读那个变量的数据?
还是要用别的方法?谢谢了!!!
解决方案 »
- 请问各位大虾如何读取USB游戏手柄的按键信息???
- windows下有获得文件后缀名的API函数吗??
- 请问一个CFile对象写入磁盘时,如果路径不存在该用哪个函数创建目录?
- 请教com初级问题!
- 一个多线程问题
- 大家帮我添加几行代码!!关于绘制控件时画笔画刷的颜色定义
- DLL内new的char数组在dll外面释放时出现错误?
- (在线等待,马上给份)简单问题——怎么样保存这个网站的背景图片(你不要认为很简单啊)进来看看
- 我想把自己绘制的图片保存在IStream类中,应该如何进行?
- recvfrom ( serverSocket,buf,MY_SOCK_SIZE, 0, (SOCKADDR*)&clientSocketAddr, &addrinSize ); 这个函数中能不能得到发送端的ip呀
- 怎样去掉窗口上的关闭按钮?
- 求助,谁有一段在网页里播放音乐的源代码!绝对给分!!!!!
是.net的东东?
相关资料可以参考SNMP的东西.如 rfc第二. getiftable()已经得到了接口的所有数据, 不用再调用getifentry().
第三, MIB_IFTABLE* ifTable = new MIB_IFTABLE[6];
你能确定接口数再6个以下??这种用法使程序通用性变差.
首先,谢谢你的回答。
1.
我又试了一下,发现他无论在有没有数据时,
都是一个很大的“常数”--1999707468。
因为我每秒循环一次读取数据,
这难道表示我的下载速度是1.9GB/s???
这显然不可能。为什么???另外,那里有关于SNMP或rfc的资料?
(最好是网上免费的)2.
我无论是否调用getifentry都有以上的结果,
似乎getiftable就可以了。3.
我不确定这里所说的接口的定义。
他是否等价于网卡/网络适配器的数量?
我应该在此基础上做一些什么样的修改?谢谢,解决了问题,一定给分。
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已经超出表示范围过,得把后一次作一下处理再用。
还有问题吗
在new后,最好memset(ifMib,0,sizeof(MIB_IFROW));
更何况,他那根没就没什么异常。
楼主呢?说说看,你的机器都有哪些接口?
主板上有6个PCI插槽(所以用6,因为觉得其他机也不会太多)
PCI网卡两张(RTL8029AS/10M、RTL8139/100M),
PCI猫一只,没有串口设备,其他的都是常见的。另外,在之前提到的“常数”--1999707468
不是IfSpeed,而是dwInOctets!!!
正是因为这样,所以我才觉得有问题。
这个常数你每次调用都是这么多吗?是其中一块网卡还是两块都是这样?你的两块网卡都实际在用吗?把你的信箱给我,我可以把我昨天验证的小程序给你试试
后来,升级了SDK后,就都没事了,
原来是SDK的问题,真没想到啊!!!好了,结帖。最后,谢谢Gargamel(格格巫)的帮助!!!
明明看到我给了Gargamel(格格巫) 100分,但在这里怎么没有分???