统计流过本机网卡的网络总流量,mfc 有没有提供什么函数可以直接获得的?还是必须要捕获流经网卡的每个数据包进行分析?统计一个局域网内 的总流量是不是和统计本机流量是一个道理?只不过让程序在局域网出口运行就行了?有没有统计流量的例子

解决方案 »

  1.   

    用GetIfEntry()函数可以获得网卡流量信息。  
       
      MIB_IFROW   ifMib;  
      ifMib.dwIndex   =   0;   //   如果你的网卡是第一个网络接口。  
      GetIfEntry(&ifMib);   //   调用完毕后,就会将ifMib中的其它成员数据添好了  
       
      ifMib结构  
      typedef   struct   _MIB_IFROW   {  
          WCHAR       wszName[MAX_INTERFACE_NAME_LEN];  
          DWORD       dwIndex;         //   index   of   the   interface  
          DWORD       dwType;           //   type   of   interface  
          DWORD       dwMtu;             //   max   transmission   unit    
          DWORD       dwSpeed;         //   speed   of   the   interface    
          DWORD       dwPhysAddrLen;         //   length   of   physical   address  
          BYTE         bPhysAddr[MAXLEN_PHYSADDR];   //   physical   address   of   adapter  
          DWORD       dwAdminStatus;         //   administrative   status  
          DWORD       dwOperStatus;           //   operational   status  
          DWORD       dwLastChange;           //   last   time   operational   status   changed    
          DWORD       dwInOctets;               //   octets   received  
          DWORD       dwInUcastPkts;         //   unicast   packets   received    
          DWORD       dwInNUcastPkts;       //   non-unicast   packets   received    
          DWORD       dwInDiscards;           //   received   packets   discarded    
          DWORD       dwInErrors;               //   erroneous   packets   received    
          DWORD       dwInUnknownProtos;     //   unknown   protocol   packets   received    
          DWORD       dwOutOctets;             //   octets   sent    
          DWORD       dwOutUcastPkts;       //   unicast   packets   sent    
          DWORD       dwOutNUcastPkts;     //   non-unicast   packets   sent    
          DWORD       dwOutDiscards;         //   outgoing   packets   discarded    
          DWORD       dwOutErrors;             //   erroneous   packets   sent    
          DWORD       dwOutQLen;                 //   output   queue   length    
          DWORD       dwDescrLen;               //   length   of   bDescr   member    
          BYTE         bDescr[MAXLEN_IFDESCR];     //   interface   description    
      }   MIB_IFROW,*PMIB_IFROW;  
      

  2.   

    刚才测了一下,
    MIB_IFROW ifMib;
    ifMib.dwIndex = ifTable->table[i].dwIndex;  //(ÕâÀïµÄ2ÊÇÄãµÄÕæʵÍø¿¨)
    GetIfEntry(&ifMib); 
    DWORD AllOut=ifMib.dwOutOctets/1024; //³öÁ÷Á¿
    DWORD AllIn=ifMib.dwInOctets/1024; //½øÁ÷Á¿
    DWORD Speed = ifMib.dwSpeed;
    CString szMsg;
    szMsg.Format("Out:%d,In:%d,Speed:%d",AllOut,AllIn,Speed);
    AfxMessageBox(szMsg);
    刚才测试了一下:
    得到的数据是 Out:10054,In:62089,100000000
    我机子开了近5个小时,也就是说这5个小时内发送的流量为 10054 KB,下载了 62089 KB,机子为百兆网卡,对么?
      

  3.   

    这个GetIfEntry函数 能不能 做到统计不同协议的流量?需要设置什么么 ?
      

  4.   

    推荐使用WIMPCAP,里面有个例子