windows获取系统网络流量

摘要:
=NO_错误,错误代码=“˂˂dwRet˂˂std::endl;free;returnfalse;}MIB_IFROW结构成员的详细描述dwType:接口类型,例如,IF_type_ETHERNET_CSMACD=6,以太网接口;IF_type-SOFTWARE_LOOPBACK=24,软件环回测试网络接口。dwSpeed:接口速度,以bps为单位,可用于计算网络带宽。bPhysAdd:接口网卡的MAC地址dwInOctets:num自系统启动以来收到的字节数可用于计算系统网络流量。dwOutOctets:发送的字节数。系统启动后,它可以用于统计系统网络流量。获取发送比特数和接收比特数。启动bootGetStatisticOfSysNetworkFlow{/*获取MIB-II接口表的大小*/DWORDwBufferLen=0;GetIfTable;/*创建MIB-II界面表*/PMIB_IFTABLEpMibIfTable=malloc;/*获取MIB-II接口表格*/DWORDwRet=GetIfTable;if(NO_ERROR!

函数

  DWORD GetIfTable(
         PMIB_IFTABLE pIfTable,
         PULONG pdwSize,
         BOOL bOrder
  );


功能

  获取MIB-II接口列表


参数

  PMIB_IFTABLE pIfTable:接收缓冲区,接收GetIfTable返回的MIB-II接口表

  PULONG pdwSize:pIfTable缓冲区字节数,若缓冲区过小则返回所需大小

  BOOL bOrder:指定pIfTable中返回的接口列表条目是否根据接口索引排序

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;
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366836(v=vs.85).aspx


返回值

  成功返回NO_ERROR,否则返回值即错误码


头文件和引用库

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


使用方法

/*获取MIB-II接口表大小*/
DWORD dwBufferLen = 0;
GetIfTable(NULL, &dwBufferLen, 0); 

/*创建MIB-II接口表*/
PMIB_IFTABLE pMibIfTable = (MIB_IFTABLE*)malloc(dwBufferLen);

/*获取MIB-II接口表*/
DWORD dwRet = GetIfTable(pMibIfTable, &dwBufferLen, 0);
if(NO_ERROR != dwRet)
{
	std::cout<<"GetIfTable != NO_ERROR, ErrorCode="<<dwRet<<std::endl;
	free(pMibIfTable);
	return false;
}

细说MIB_IFROW结构体成员

  dwType:接口类型,例如IF_TYPE_ETHERNET_CSMACD=6, Ethernet网络接口;IF_TYPE_SOFTWARE_LOOPBACK=24,软件回环测试网络接口。23号之前的网络接口可用来统计系统流量

  dwSpeed:接口速度,单位bps,可用来计算网络带宽

  bPhysAddr:接口网卡的MAC地址

  dwInOctets:接收的字节数,自系统启动,可用来统计系统网络流量。
  dwOutOctets:发送的字节数,自系统启动,可用来统计系统网络流量。


获取网络带宽

bool GetNetworkBandwithByMidTable(int &iMbsBandwidth)
{
	/*获取MIB-II接口表大小*/
	DWORD dwBufferLen = 0;
	GetIfTable(NULL, &dwBufferLen, 0); 

	/*创建MIB-II接口表*/
	PMIB_IFTABLE pMibIfTable = (MIB_IFTABLE*)malloc(dwBufferLen);

	/*获取MIB-II接口表*/
	DWORD dwRet = GetIfTable(pMibIfTable, &dwBufferLen, 0);
	if(NO_ERROR != dwRet)
	{
		std::cout<<"GetIfTable != NO_ERROR, ErrorCode="<<dwRet<<std::endl;
		free(pMibIfTable);
		return false;
	}

	iMbsBandwidth = INT_MAX;

	/*多网卡*/
	for(int i = 0; i != pMibIfTable->dwNumEntries; ++i)
	{
		if (pMibIfTable->table[i].dwType <= 23)
		{
			int iTmp = static_cast<int>(pMibIfTable->table[i].dwSpeed/1000/1000);
			if(iTmp != 0 && iTmp < iMbsBandwidth)
				iMbsBandwidth = iTmp;
		}
	}

	free(pMibIfTable);
	if(iMbsBandwidth == INT_MAX)
		return false;
	return true;
}

网卡的传输速度有10Mbps、100Mbps、1000Mbps,查看网卡速度的方法:设备管理器—网络适配器—选择网卡—属性—高级—连接速度和双工模式—值—下拉菜单中的最大值。

网络带宽由多种因素决定,例如为连接在只具备100M传输速度的双绞线上的计算机配置1000M的网卡就是一种浪费,因为其至多也只能实现100M的传输速率。

故网络带宽为各种物理介质中的最小值,可认为是所有网卡传输速度的最小值(且不为0)。


获取发送比特数和接收比特数,自系统启动

bool GetStatisticOfSysNetworkFlow(DWORD &dwbitTotalRecv, DWORD &dwbitTotalSend)
{
	/*获取MIB-II接口表大小*/
	DWORD dwBufferLen = 0;
	GetIfTable(NULL, &dwBufferLen, 0); 

	/*创建MIB-II接口表*/
	PMIB_IFTABLE pMibIfTable = (MIB_IFTABLE*)malloc(dwBufferLen);

	/*获取MIB-II接口表*/
	DWORD dwRet = GetIfTable(pMibIfTable, &dwBufferLen, 0);
	if(NO_ERROR != dwRet)
	{
		std::cout<<"GetIfTable != NO_ERROR, ErrorCode="<<dwRet<<std::endl;
		free(pMibIfTable);
		return false;
	}

	dwbitTotalRecv = dwbitTotalSend = 0;

	/*多网卡*/
	for(int i = 0; i != pMibIfTable->dwNumEntries; ++i)
	{
		if (pMibIfTable->table[i].dwType <= 23)
		{
			dwbitTotalRecv += pMibIfTable->table[i].dwInOctets;
			dwbitTotalSend += pMibIfTable->table[i].dwOutOctets;
		}
	}

	/*Byte转bit*/
	dwbitTotalRecv *= 8;
	dwbitTotalSend *= 8;

	free(pMibIfTable);
	return true;
}
计算每秒发送比特数和每秒接收比特数

bool GetSysNetworkFlowByMidTable(DWORD &dwbpsRecv, DWORD &dwbpsSend)
{
	/*首次获取*/
	DWORD dwTotalRecv1 = 0, dwTotalSend1 = 0;
	if(!GetStatisticOfSysNetworkFlow(dwTotalRecv1, dwTotalSend1))
	{
		printf("GetStatisticOfSysNetworkFlow == false
");
		return false;
	}

	Sleep(1000);

	/*再取*/
	DWORD dwTotalRecv2 = 0, dwTotalSend2 = 0;
	if(!GetStatisticOfSysNetworkFlow(dwTotalRecv2, dwTotalSend2))
	{
		printf("GetStatisticOfSysNetworkFlow == false
");
		return false;
	}

	/*计算*/
	dwbpsRecv = dwTotalRecv2 - dwTotalRecv1;
	dwbpsSend = dwTotalSend2 - dwTotalSend1;

	return true;
}

注:Windows Performance Counter性能计数器的Network Interface对象能够获取系统网络数据,经验证在Win7下Performance Counter可能不存在Network Interface对象,导致程序运行失败。



免责声明:文章转载自《windows获取系统网络流量》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【Android】WebDav For AndroidLua和C的语法差别下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ABP官方文档翻译 3.1 实体

实体 实体类 聚合根类领域事件 常规接口 审计 软删除 激活/失活实体 实体改变事件 IEntity接口   实体是DDD(领域驱动设计)的核心概念之一。Eric Evans描述它为"An object that is not fundamentally defined by its attributes, but rather by a t...

Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单

在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介绍如何获取Access Token,再介绍如何通过Access Token来在微信内添加自定义菜单(注意,开发者需要申请测试账号来测试自定义菜单,如何申请请参...

04-SQLServer中链接服务器用法--连接Excel

一、总结 1、使用这个SQLServer读取Excel里面的数据,首先要安装Access驱动程序。 2、如果查不到数据的话,检查一下访问接口的允许进程内是否选中。(我测试的时候,不选中也能查出来结果) 二、操作步骤 1、安装AccessDatabaseEngine_X64.exe驱动程序 (1)一直下一步安装就行 下载地址:https://www.mic...

Android平台下的JNI开发

JNI是Java Native Interface的缩写,通过JNI可以方便我们在Android平台上进行C/C++编程。要用JNI首先必须安装Android的NDK,配置好NDK环境之后就可以在Eclipse下进行C/C++开发了。 其实JNI的原理很容易理解,其本质就是在Java层定义一个接口,同时在C层用C/C++代码实现该接口的功能并编译成动态链接...

面向对象三大特性五大原则 + 低耦合高内聚

面向对象的三大特性是"封装、"多态"、"继承",五大原则是"单一职责原则"、"开放封闭原则"、"里氏替换原则"、"依赖倒置原则"、"接口分离原则"。 什么是面向对象 面向对象(Object Oriented,OO)是软件开发方法。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、...

纯手工秒杀VM,SE等虚拟机Handle

/************************************** /* 作者:半斤八兩 /* 博客:http://cnblogs.com/bjblcracked /* 日期:2014-12-08 19:01 /**************************************       只是感兴趣,没有其他目的。失误之处敬请诸位大...