Windows性能计数器统计网络流量

使用性能计数器的基本步骤是:

1.打开计数器PdhOpenQuery

2.为计数器句柄分配空间

3.把感兴趣的计数器添加进来PdhAddCounter

4.收集数据PdhCollectQueryData

5.得到计数器的数值PdhGetFormattedCounterValue

6.关闭计数器PdhCloseQuery

#include <iostream>
#include <Pdh.h>
#include <list>
#include <string>
#include <numeric>
#pragma comment(lib, "Pdh.lib")
using namespace std;
 
void main()
{
    list< HCOUNTER> m_counters;
    HQUERY m_hQuery;
 
    string counter_list;
    string instance_list;
    DWORD clistlen = 0;
    DWORD ilistlen = 0;
 
    const char * netface = "Network Interface";
    const char * in_speed = "Bytes Received/sec";
    const char * out_speed = "Bytes Sent/sec";
 
    list< double> m_net_total_in_bps;
    list< double> m_net_total_out_bps;
 
    PdhEnumObjectItemsA(0, 0, netface, 0, &clistlen, 0, &ilistlen, PERF_DETAIL_WIZARD, 0);
    counter_list.assign(clistlen, 0);
    instance_list.assign(ilistlen, 0);
    if (ERROR_SUCCESS != PdhEnumObjectItemsA(0, 0, netface, &counter_list[0], &clistlen,
        &instance_list[0], &ilistlen, PERF_DETAIL_WIZARD, 0))
        return;
 
    PDH_STATUS pdhStatus;
    pdhStatus = PdhOpenQuery (0, 0, &m_hQuery);
    if ( pdhStatus != ERROR_SUCCESS )
        return;
 
    char *tmpsz = &instance_list[0];
    // 枚举网卡
    for (; *tmpsz!=0; tmpsz+=(strlen(tmpsz)+1))
    {
        string query_obj_in = string("\\") + netface + "(" + tmpsz + ")" + "\\" 
            + in_speed;
        string query_obj_out = string("\\") + netface + "(" + tmpsz + ")" + "\\" 
            + out_speed;
 
        HCOUNTER tmpcounter;				
        pdhStatus = PdhAddCounterA( m_hQuery , query_obj_in.c_str(), 0 , &tmpcounter ) ;
        if ( pdhStatus != ERROR_SUCCESS )
        {
            PdhCloseQuery(m_hQuery) ;
            return;
        }
        m_counters.push_back(tmpcounter);
 
        pdhStatus = PdhAddCounterA(m_hQuery, query_obj_out.c_str(), 0 , &tmpcounter) ;
        if (pdhStatus != ERROR_SUCCESS)
        {
            PdhCloseQuery (m_hQuery) ;
            return;
        }
        m_counters.push_back(tmpcounter);
    }
 
    // 统计流量,每秒一次
    while(1)
    {
        PDH_FMT_COUNTERVALUE fmtValue;
        DWORD dwctrType;
 
        pdhStatus = PdhCollectQueryData(m_hQuery);
        if (pdhStatus != ERROR_SUCCESS)
        {
            return;
        }
 
        double in_bps = 0.0;
        double out_bps = 0.0;
        double in_avg_bps = 0.0;
        double out_avg_bps = 0.0;
 
        // 遍历每块网卡,把流量加起来
        for (list< HCOUNTER>::iterator iter = m_counters.begin();
            iter != m_counters.end();
            iter++)
        {
            pdhStatus = PdhGetFormattedCounterValue(*iter , PDH_FMT_DOUBLE , &dwctrType,
                &fmtValue ) ;
            if ( pdhStatus == ERROR_SUCCESS )
            {
                in_bps += fmtValue.doubleValue;
            }
            iter ++;
            pdhStatus = PdhGetFormattedCounterValue(*iter, PDH_FMT_DOUBLE, &dwctrType,
                 &fmtValue ) ;
            if ( pdhStatus == ERROR_SUCCESS )
            {
                out_bps += fmtValue.doubleValue;					
            }
        }
 
        m_net_total_in_bps.push_back(in_bps);
        m_net_total_out_bps.push_back(out_bps);
        if (m_net_total_in_bps.size() > 10)
            m_net_total_in_bps.pop_front();
        if (m_net_total_out_bps.size() > 10)
            m_net_total_out_bps.pop_front();
        in_avg_bps = accumulate(m_net_total_in_bps.begin(), m_net_total_in_bps.end(), 0.0)
            / m_net_total_in_bps.size();
        out_avg_bps = accumulate(m_net_total_out_bps.begin(), m_net_total_out_bps.end(),
            0.0) / m_net_total_out_bps.size();
 
        cout << "IN  = " << in_avg_bps/1024 << "KBps" << endl;
        cout << "OUT = " << out_avg_bps/1024 << "KBps" << endl;
 
        Sleep(1000);
    }
}


原文地址:http://www.sizeof.cn/html/2009/76.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大致功能: 1、客户资料维护(新增、删除、修改等),参考Customer表、CustNumber表、Route表,其中客户编号是关系索引。 2、国家基本信息维护,参考Country表。 3、数据来源:XXX.xls,可导入至asscess数据库中,如DataSheet表。其中“CALLED_STATION_ID”字段前6个字符代表接入号,其余为对方号码(包括国际长途国家代号),可以根据国家基本信息提取国家代号。接入号是确定客户的关键字,一个客户允许有多个接入号。 4、查询操作,条件输入:日期、客户编号/客户名称、接入号、路由IP地址、国家代号,以上输入信息从基本表中选择,不输入表示该字段内容不进行条件过滤。举例:输入客户编号自动显示客户名称,接入号为对应的客户接入号,用下拉列表显示,允许选空,表示该客户的所有接入号,路由IP地址及国家代号用来做过滤条件,允许为空。 5、对Route表的补充说明,这是一个客户允许的路由IP地址,其中每一个地址对应一种计费规则(Rule字段),共有三种计费规则,分别代表DataSheet表中的三个字段(MIN306、MIN06、MIN60均为分钟数),统计时根据路由IP的计费规则,取相应的字段。 6、本说明中未做说明的DataSheet字段可以不加理会,用到的字段有:LOGGEDAT、NAS_IP_ADDRESS、CALLED_STATION_ID、MIN306、MIN06、MIN60。 7、输出的报表格式如下,该报表可保存为Excel文件,也可直接发送给客户(通过Email)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值