如果我的机器是拨号上网,有没有接口可以查询到当前的流量(也就是双击系统栏中的图标出现的发送:**,接收:**)我想得到这两个数据,有没有办法,谢谢,分数不够,我另开帖子给我,或者联系我:[email protected] 我现在可用分有9173,要可以全部给

解决方案 »

  1.   

    我知道如何做
    没必要把你分全要了,给2000分就可以了
    我整理一下,然后给你发email吧
      

  2.   

    代码如下#include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <tchar.h>
    #include <pdh.h>#pragma comment (lib, "pdh.lib")#define SAMPLE_INTERVAL_MS  1000
    #define MAXPATH 80int __cdecl _tmain (int argc, TCHAR **argv)
    {   HQUERY          hQuery;
       HCOUNTER        *pCounterHandle;
       PDH_STATUS      pdhStatus;
       PDH_FMT_COUNTERVALUE   fmtValue;
       DWORD           ctrType;
       SYSTEMTIME      stSampleTime;
       PDH_BROWSE_DLG_CONFIG  BrowseDlgData;
       TCHAR            szPathBuffer[MAXPATH];
       int             nRetCode = 0;   // Open the query object.
       pdhStatus = PdhOpenQuery (0, 0, &hQuery);   // Allocate the counter handle array. Allocate room for
       //  one handle per command line arg, not including the
       //  executable file name.
       pCounterHandle = (HCOUNTER *)GlobalAlloc(GPTR, sizeof(HCOUNTER));   // Zero the contents of the structure.
       memset (&BrowseDlgData, 0, sizeof(PDH_BROWSE_DLG_CONFIG));   // Initialize the browser dialog window settings.
       BrowseDlgData.bIncludeInstanceIndex = FALSE;   
       BrowseDlgData.bSingleCounterPerAdd = TRUE;
       BrowseDlgData.bSingleCounterPerDialog = TRUE;  
       BrowseDlgData.bLocalCountersOnly = FALSE;      
       BrowseDlgData.bWildCardInstances = TRUE;
       BrowseDlgData.bHideDetailBox = TRUE;
       BrowseDlgData.bInitializePath = FALSE;     
       BrowseDlgData.bDisableMachineSelection = FALSE;
       BrowseDlgData.bIncludeCostlyObjects = FALSE;
       BrowseDlgData.bReserved = TRUE;
       BrowseDlgData.hWndOwner = NULL;   
       BrowseDlgData.bReserved = FALSE;           
       BrowseDlgData.szReturnPathBuffer = szPathBuffer;
       BrowseDlgData.cchReturnPathLength = MAXPATH;;
       BrowseDlgData.pCallBack = NULL;   
       BrowseDlgData.dwCallBackArg = 0;
       BrowseDlgData.CallBackStatus = ERROR_SUCCESS;
       BrowseDlgData.dwDefaultDetailLevel = PERF_DETAIL_WIZARD;
       BrowseDlgData.szDialogBoxCaption = "Select a counter to monitor.";   // Display the counter browser window.
       pdhStatus = PdhBrowseCounters (&BrowseDlgData);   pdhStatus = PdhAddCounter (hQuery,
                                  szPathBuffer, 
                                  0, 
                                  pCounterHandle);   // "Prime" counters that need two values to display a 
       //   formatted value.
       pdhStatus = PdhCollectQueryData (hQuery);   // Print counter values until a key is pressed.
       while (!_kbhit()) {     // Wait one interval.
         Sleep(SAMPLE_INTERVAL_MS);     // Get the sample time.
         GetLocalTime (&stSampleTime);     // Get the current data values.
         pdhStatus = PdhCollectQueryData (hQuery);     // Print the time stamp for the sample.
         _tprintf (TEXT("\n\"%2.2d/%2.2d/%4.4d %2.2d:%2.2d:%2.2d.%3.3d\""),
                   stSampleTime.wMonth, 
                   stSampleTime.wDay, 
                   stSampleTime.wYear,
                   stSampleTime.wHour, 
                   stSampleTime.wMinute, 
                   stSampleTime.wSecond,
                   stSampleTime.wMilliseconds);     // Get the current value of this counter.
         pdhStatus = PdhGetFormattedCounterValue (*pCounterHandle,
                                                  PDH_FMT_DOUBLE,
                                                  &ctrType,
                                                  &fmtValue);     if (pdhStatus == ERROR_SUCCESS) {
             _tprintf (TEXT(",\"%.20g\""), fmtValue.doubleValue);
         } else {         // Print the error value.
             _tprintf (TEXT(".\"-1\"")); 
         }
       }   // Close the query.
       pdhStatus = PdhCloseQuery (hQuery);   return nRetCode;
    }运行时,性能对象选Network Interface
    计数器,选你想要的
    实例你也自己看着选,然后确定就可以了要退出的话,随便敲一下键盘就可以了
      

  3.   

    xstring(麻雀):谢谢了,好像只能给100分,我另开贴给你分吧,2000够不够
      

  4.   

    麻雀,你的E-mail我收到了,我今天验证一下,如果你给的代码没错的,我最晚明天晚上(3月30)开贴给你分数,不过这里先谢了.
      

  5.   

    麻雀,你的代码我已经看了,你用的这个方法直接调用系统的计数器,我的用不上.我将我的程序过程跟你描述一下:我这时候是在写一个NAT代理上网程序,则需要得到拨号或者网卡的实时流量.假设NAT运行在务器,则你这段代码,可以查询到所用到的外网网卡的流量,但是,如果你是使用了NAT代理上网,而此时数据不上报到上层Windows,而是直接通过我自己的驱动发出去,这时你的代码是查询不到网卡流量的.你可以再测试一下.
      

  6.   

    暂时没有比较简洁的方法
    你通过运行子程序的方法来获得吧netsh.exe -c "interface ip" show interface 本地连接上面这个命令可以获得本地连接这个接口的数据
    以下是在我机器上运行的结果C:\symbols>netsh -c "interface ip" show interface 本地连接MIB-II 接口信息
    ------------------------------------------------------
    索引:                               65540
    用户好记的名称:                     本地连接
    GUID 名称:                          {A0C5C680-C58B-4593-B953-AD8757E98FAC}
    类型:                               Ethernet
    MTU:                                1500
    速度:                               100000000
    物理地址:                           00-E0-4C-67-16-8C
    Admin 状态:                         启用
    操作状态:                           可操作
    上次更改:                           1181125160
    输入字节数:                         43592145
    输入的 Unicast 数据包:              58927
    输入的 Non-unicast 数据包:          321910
    丢弃的输入数据包:                   0
    输入的错误包:                       0
    输入的未知协议数据包:               8830
    输出字节数:                         6355629
    输出的 Unicast 数据包:              65476
    输出的 Non-unicast 数据包:          191
    丢弃的输出数据包:                   0
    输出的错误数据包:                   0
    输出队列长度:                       0
    描述:                               Realtek RTL8139 Family PCI Fast Ethernet NICC:\symbols>
    你要的结果就在这里面,你和界面上的数据比较一下就知道该取哪些数据了如果要得到所有连接的数据,就运行 
    netsh.exe -c "interface ip" show interface
      

  7.   

    我调试过这些程序,它们使用的都是未公开的DeviceIoControl调用估计很难查到资料。目前我能想到的最简单的方法只能这样了,另外,这样得到的数据也是实时的,不过需要你不断的调用这个子程序并分析其标准输出
      

  8.   

    我又仔细看了看本地连接状态这个窗口虽在netshell.dll当中实现的。在这里面获得网络连接的各种统计数用到了大量的com对象,不过这些对象在任何文档中都查不到接口共有十九个
    iid分别为
    {FAEDCF53-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF55-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF56-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF57-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF58-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF59-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF5B-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF5C-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF5D-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF5F-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF60-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF64-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF65-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF66-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF67-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF68-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF69-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF6A-31FE-11D1-AAD2-00805FC1270E}
    {FAEDCF6B-31FE-11D1-AAD2-00805FC1270E}也就我上面后来说的那个方法实用一些 :(