Win32API 计算网卡信息


参考文章:

MIB_IFROW Structure

如何取当前网卡速率如(100Mbps/10Mbps/...)?

网络带宽利用率的一般计算方法



#include <Iphlpapi.h>
#pragma comment(lib,"Iphlpapi.lib")

double CTestNetWordDlg::GetNetWork()
{
	DWORD dwOutBufLen=0; 
	PIP_ADAPTER_INFO pAdapterInfo=NULL,pAdapter=NULL; 
	MIB_IFROW zSNMP; 
	char sTemp[20]; 
	int iReturn; 

	iReturn = GetAdaptersInfo(pAdapterInfo,&dwOutBufLen); 
	if(iReturn!=ERROR_BUFFER_OVERFLOW) 
	{ 
		return 0; 
	} 

	pAdapterInfo =(PIP_ADAPTER_INFO) HeapAlloc(GetProcessHeap(), 0, dwOutBufLen); 
	iReturn=GetAdaptersInfo(pAdapterInfo,&dwOutBufLen); 
	if(iReturn!=ERROR_SUCCESS)      
	{      
		HeapFree(GetProcessHeap(), 0, pAdapterInfo);     
		return 0;      
	} 
	pAdapter = pAdapterInfo; 

	//find if there is ppp adapter
	double iIfSpeed;
	while(pAdapter!=NULL )      
	{      
		zSNMP.dwIndex = pAdapter->Index;     
		iReturn=GetIfEntry(&zSNMP);     
		if(iReturn!=NO_ERROR)      
			return 0;      
		
		iIfSpeed = 1.0*zSNMP.dwSpeed/(1000*1000);   //----------你要的速率  
		
		pAdapter = pAdapter->Next; 

		TRACE(_T("%f"),iIfSpeed);
	} 

	return iIfSpeed;
}



先说一下,使用以后函数记得加:

#include <iphlpapi.h> 
#pragma comment ( lib, "iphlpapi.lib")

使用GetIfTable()获取各个端口信息的时候用到的 _MIB_IFTABLE结构:

 typedef struct _MIB_IFTABLE {
  DWORD     dwNumEntries; //得到的端口个数
  MIB_IFROW table[ANY_SIZE]; //得到的各个端口的信息,这个结构才是重点
} MIB_IFTABLE, *PMIB_IFTABLE;


typedef struct _MIB_IFROW {
  WCHAR wszName[MAX_INTERFACE_NAME_LEN];
  DWORD dwIndex;
  DWORD dwType;
  DWORD dwMtu;
  DWORD dwSpeed;
  DWORD dwPhysAddrLen;
  BYTE  bPhysAddr[MAXLEN_PHYSADDR];
  DWORD dwAdminStatus;
  DWORD dwOperStatus;
  DWORD dwLastChange;
  DWORD dwInOctets;
  DWORD dwInUcastPkts;
  DWORD dwInNUcastPkts;
  DWORD dwInDiscards;
  DWORD dwInErrors;
  DWORD dwInUnknownProtos;
  DWORD dwOutOctets;
  DWORD dwOutUcastPkts;
  DWORD dwOutNUcastPkts;
  DWORD dwOutDiscards;
  DWORD dwOutErrors;
  DWORD dwOutQLen;
  DWORD dwDescrLen;
  BYTE  bDescr[MAXLEN_IFDESCR];
} MIB_IFROW, *PMIB_IFROW;


wzsName:包含了该接口的名字(多字节的),具体也不知道哈意思,就是一串数字,有懂的和我说一下

dwIndex:该接口的索引值,比如有多个网卡的时候,每个网卡都有一个索引值,是会随着网卡正在被使用的个数变化的

dwType:该接口的类型,这个类型是被IANA(是个什么协会吧)定义的,有以下几种:



Value Meaning
IF_TYPE_OTHER   1   Some other type of network interface.
IF_TYPE_ETHERNET_CSMACD   6   An Ethernet network interface.
IF_TYPE_ISO88025_TOKENRING   9   A token ring network interface.
IF_TYPE_PPP   23   A PPP network interface.
IF_TYPE_SOFTWARE_LOOPBACK   24   A software loopback network interface.
IF_TYPE_ATM   37   An ATM network interface.
IF_TYPE_IEEE80211  71   An IEEE 802.11 wireless network interface.
IF_TYPE_TUNNEL  131  A tunnel type encapsulation network interface.
IF_TYPE_IEEE1394   144   An IEEE 1394 (Firewire) high performance serial bus network interface.


其中24是网络回路的网卡(我自己是这样叫的),就是127.0.0.1那个,应该是每个机子都有的吧
一般我们用的是6.


dwMtu:百度一下MTU就知道了,就是该接口的最大传输单元,理解为该通信协议的某一层上面能通过的最大的数据包的大小(以字节为单位)

dwSpeed:该接口最大的传输速率,可是看成是这个接口每秒最多传多大的数据的一个规格,我刚开始的时候以为这是该接口的即时传输速度呢,郁闷

dwPhysAddrLen: bPhysAddr指向的地址的长度

bPhysAddr:指向该接口地址的指针

dwAdminStatus:该接口的管理状态,按我的理解就是人为设定的那个状态:启用/禁用

dwOperStatus:该接口的操作状态,它可以取以下的值,看了下面的值就知道是什么意思了


0   MIB_IF_OPER_STATUS_NON_OPERATIONAL    网络适配器被禁止的状态;
1   MIB_IF_OPER_STATUS_UNREACHABLE    没有连接的状态;
2   MIB_IF_OPER_STATUS_DISCONNECTED  电缆未连接的状态;
3   MIB_IF_OPER_STATUS_CONNECTING   广域网适配器连接中的状态;
4   MIB_IF_OPER_STATUS_CONNECTED   广域网适配器连接上远程对等点的状态;
5   MIB_IF_OPER_STATUS_OPERATIONAL  局域网适配器默认的连接状态;


dwLastChange: 适配器状态最后一次改变的时间;
dwInOctets: 该接口总的收到的数据大小;
dwInUcastPkts As Long     '总共收到(unicast包)
dwInNUcastPkts As Long    '总共收到(non-unicast包),包括广播包和多点传送包dwInDiscards As Long     '收到后丢弃包总数(即使没有错误)
dwInErrors As Long        '收到出错包总数
dwInUnknownProtos As Long   '收到后因协议不明而丢弃的包总数
dwOutOctets As Long       '总共发送(字节)
dwOutUcastPkts As Long    '总共发送(unicast包)
dwOutNUcastPkts As Long '总共发送(non-unicast包),包括广播包和多点传送包
dwOutDiscards As Long     '发送丢弃包总数(即使没有错误)
dwOutErrors As Long       '发送出错包总数
dwOutQLen As Long      '发送队列长度
dwDescrLen As Long       ' bDescr部分有效长度
bDescr(0 To 255) As Byte  '接口描述  也就是在设备管理器上看的到名字


用一秒钟前后得到的dwInOctets数据相减,就是这一秒中该接口的流量,用这个方法就可以计算机子的即时流量了


但是当机子有多个网卡时,怎么判断目前机子正在用的是哪一个,我也不知道,在网上看好多例子,当有多网卡时,都是直接用第一个来计算流量的,难道默认得到的结构数组第一个就是正在用的? 好像是这样的,如果有更详细的,留下说明吧 


网友答复:当有多网卡时,是根据bDescr来匹配的



、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

一般情况下
计算一个路由器的CPU利用率时, http://www.cisco.com/public/mibs/v1/OLD-CISCO-CPU-MIB中的busPer对象表示为百分比的形式。
计算一个半双工10M 接口的利用率时,你可以选择变量——使用MIB II(RFC2233)的变量或特定厂商提供的变量。在MIB II变量情形里,应用程序按照下列步骤人工计算百分比:
1. 计算iflnOctects和iflnOctets的两个采样之间的 (差)
2. 将这些值加在一起
3. 把总值转换成每秒字节数 *8/采样周期质量
4. 将该字节数除以ifSpeed(以字节数为单位的接口速度)
5. 将结果乘以100得到百分比
如果是cisco的设备,还可以用下边的值计算
在站点 http://www.cisco.com/public/mibs/v1/OLD-XISCO-INTEFACES-MIB.my 还有一些称作locIfInBitsSec和1ocIfOutBitsSec的Cisco专用变量,这些变量不需要前一个例子里的第一步。注意这个MIB并不始终支持子接口。
评价利用率的几点准则
因为有多种方法可以收集利用率,所以在选择使用哪种类型的变量时,我们建议采用以下规则:
1. 在求助于特定企业的MIB之前,选择公共域MIB对象。如果你坚持使用公共域MIB,很有可能这些MIB对象将跨厂商平台实现;你可以将你的代码重新使用于具有相同功能的其他设备类型
2. 当储存所收集的数据时,使用原始数据而不是设备产生的或NMS计算的平均值数据。对于分析长期趋势来说,数据尽可能原始很重要——合并或汇总以前所计算的或平滑的数据会产生不太准确的结果。
另外,请注意这些变量只报告特定接口看见的流量。
关于利用率,经验法则是你不应该假设0%必定就是好的而100%必定就是坏的。理论上的最大利用率并不总是反映问题的阈值。你必须使用基准分析去确定你的组织关心哪些阈值。
例如,路由器CPU的利用率偶然达到最高点100%并不一定是件坏事。这恰恰表明设备没有闲暇时间。然而,如果一段时期内某个CPU利用率维持在100%,那可能表示在丢包,在这种情况里,你应该检查其他信息,如数据包丢弃。
一个相反的例子是半双工,共享介质的10BaseT以太网利用率。即使10BaseT的最大理论容量是10MB,在某些情况下达到一半容量也可能导致媒质不能用。在这种特殊情况里,原因是当利用率升高时,以太网碰撞率也会升高。根据基准分析,你可以确认某个特定的共享以太网网段应将事件的阈值设为30%,以表示一个高水位标志。
接口利用率是网络利用率的主要指标。根据你测量的连接是半双工的还是全双工的,应该使用以下公式。共享LAN连接往往是半双工的,这主要是因为竞争检测要求设备在发送之前必须侦听。WAN连接通常是全双工的,因为该连接是点对点的连接;两个设备能够同时进行传送和接收,因为它们现在知道只有一个其他设备在共享这个连接。
因为MIB II变量是以计数器的形式储存的,你必须进行两轮轮询并且算出这两者之间的差(即公式里的)。
ifInOctets              在收集snmp ifInOctets对象的两个轮询周期之间的差值,该对象表示输入流量的字节数。 
ifOutOctets             在收集snmp ifOutOctets对象的两个轮询周期之间的差值,该对象表示输出量的字节数。
IfSpeed                  作为snmp IfSpeed对象报告的接口速率。
对于半双工来说,在计算利用率时使用公式(ifInOctets+?ifOutOctets)/((秒数) IfSpeed)×8×100
对于全双工来说,计算利用率要求更多的技巧。例如,对于全T-1串口连接,线速是1.544Mbps。这意味着一个T-1接口可以接收和传送1.544Mbps,可能的总带宽为3.088Mbps!在计算全双工连接的接口带宽时,更准确的方法是分别测量输入利用率和输出利用率,如下式所示:
    输入利用率=(ifInOctets×8×100)/((秒数) *IfSpeed)
    输出利用率=(ifOutOctets×8×100)/((秒数) *IfSpeed)




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值