vc获得网卡流量信息

欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧!
//获得网卡流量信息        
DWORD dwIfBufSize = 0;
    BOOL bRet;

    if(m_pMIT == NULL)
        m_pMIT = new MIB_IFTABLE[sizeof(MIB_IFTABLE)];

    bRet = ::GetIfTable(m_pMIT,&dwIfBufSize,0);
    if(bRet == ERROR_INSUFFICIENT_BUFFER)//如果内存不足,则重新分配内存大小
    {
        if(dwIfBufSize != NULL)
            delete [] m_pMIT;
        m_pMIT = new MIB_IFTABLE[dwIfBufSize];
    }

    bRet = ::GetIfTable(m_pMIT,&dwIfBufSize,0);
    if (bRet == NO_ERROR)
    {
        if (m_pMIT->dwNumEntries <= 1)
        {
            //bResult = false;
        }
        else
        {
            __int64 i64TotalOutOctets = 0;
            __int64 i64TotalInOctets = 0;
            //多網卡
            for(int i=0; i<(m_pMIT->dwNumEntries); i++)
            {
                if (m_pMIT->table[i].dwType <= 23)
                {
                    //当前上传
                    i64TotalOutOctets += m_pMIT->table[i].dwOutOctets;
                    //当前下载
                    i64TotalInOctets += m_pMIT->table[i].dwInOctets;
                    //bResult = mit.table[i].dwOperStatus;
                    //if (bResult)
                    {
                        //return true;
                    }
                }
            }
            memset(szVal,0,sizeof(szVal));
            if(m_oldUploadOctets != 0 && (i64TotalOutOctets > m_oldUploadOctets))
                m_curUploadOctets = i64TotalOutOctets - m_oldUploadOctets;
            m_oldUploadOctets = i64TotalOutOctets;
            lengthToStr(m_curUploadOctets * 8,szVal);
            m_CapabilityDlgObj.GetDlgItem(IDC_STA_NETUPSPEED)->SetWindowText(szVal);
            //下载
            memset(szVal,0,sizeof(szVal));
            if(m_oldDownloadOctets != 0 && (i64TotalInOctets > m_oldDownloadOctets))
                m_curDownloadOctets = i64TotalInOctets - m_oldDownloadOctets;
            m_oldDownloadOctets = i64TotalInOctets;
            lengthToStr(m_curDownloadOctets * 8,szVal);
            m_CapabilityDlgObj.GetDlgItem(IDC_STA_NETDNSPEED)->SetWindowText(szVal);
        }
    }


还有个wincap 的例子

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>

#include "include/pcap.h"

#pragma comment(lib,"lib/Packet.lib")
#pragma comment(lib,"lib/wpcap.lib")

void usage();

void dispatcher_handler(u_char *, const struct pcap_pkthdr *, const u_char *);

void _tmain(int argc, _TCHAR* argv[])
{
pcap_t *fp;
char errbuf[PCAP_ERRBUF_SIZE];
struct timeval st_ts;
u_int netmask;
struct bpf_program fcode;
  
    /* 检查命令行参数的合法性 */

        
    /* 打开输出适配器 */
    if((fp= pcap_open_live("\\Device\\NPF_{4C280CAF-B56F-467D-91E2-43F8C54B5BD2}"/*我的网卡名*/,100,1,1000,errbuf))==NULL)
    {
        fprintf(stderr,"\nUnable to open adapter %s.\n", errbuf);
        return;
    }

    /* 不用关心掩码,在这个过滤器中,它不会被使用 */
    netmask=0xffffff; 

    // 编译过滤器
    if (pcap_compile(fp, &fcode, "ether proto 0x8864"/*我用的是ADSL这里是设置只接收PPPOE的包*/, 1, netmask) <0 )
    {
        fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
        /* 释放设备列表 */
        return;
    }
    
    //设置过滤器
    if (pcap_setfilter(fp, &fcode)<0)
    {
        fprintf(stderr,"\nError setting the filter.\n");
        pcap_close(fp);
        /* 释放设备列表 */
        return;
    }

    /* 将接口设置为统计模式 */
    if (pcap_setmode(fp, MODE_STAT)<0)
    {
        fprintf(stderr,"\nError setting the mode.\n");
        pcap_close(fp);
        /* 释放设备列表 */
        return;
    }


    printf("NetWork traffic summary:\n");

    /* 开始主循环 */
    pcap_loop(fp, 0, dispatcher_handler, (PUCHAR)&st_ts);

    pcap_close(fp);
    return;
}

void dispatcher_handler(u_char *state, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    struct timeval *old_ts = (struct timeval *)state;
    u_int delay;
    LARGE_INTEGER Bps,Pps;
    struct tm *ltime;
    char timestr[16];
    time_t local_tv_sec;

    /* 以毫秒计算上一次采样的延迟时间 */
    /* 这个值通过采样到的时间戳获得 */
    delay=(header->ts.tv_sec - old_ts->tv_sec) * 1000000 - old_ts->tv_usec + header->ts.tv_usec;
    /* 获取每秒的比特数b/s */
    Bps.QuadPart=(((*(LONGLONG*)(pkt_data + 8)) * 8 * 1000000) / (delay));
    /*                                            ^      ^
                                                  |      |
                                                  |      | 
                                                  |      |
                              将字节转换成比特 --   |
                                                         |
                                       延时是以毫秒表示的 --
    */

    /* 得到每秒的数据包数量 */
    Pps.QuadPart=(((*(LONGLONG*)(pkt_data)) * 1000000) / (delay));

    /* 将时间戳转化为可识别的格式 */
    local_tv_sec = header->ts.tv_sec;
    ltime=localtime(&local_tv_sec);
    strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

    /* 打印时间戳*/
    printf("%s ", timestr);

    /* 打印采样结果 */
    printf("BPS=%I64u ", Bps.QuadPart);
    printf("PPS=%I64u\n", Pps.QuadPart);

    //存储当前的时间戳
    old_ts->tv_sec=header->ts.tv_sec;
    old_ts->tv_usec=header->ts.tv_usec;
}


void usage()
{
    
    printf("\nShows the TCP traffic load, in bits per second and packets per second.\nCopyright (C) 2002 Loris Degioanni.\n");
    printf("\nUsage:\n");
    printf("\t tcptop adapter\n");
    printf("\t You can use \"WinDump -D\" if you don't know the name of your adapters.\n");

    exit(0);
}


欢迎加入我们的QQ群,无论你是否工作,学生,只要有c / vc / c++ 编程经验,就来吧! 158427611 
 

你可能感兴趣的:(vc获得网卡流量信息)