用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧Visual C++

如何得到拨号网络传输速度

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:29:12

H文件:rasSpdM.h

#ifndef __RASSPDMON_H_#define __RASSPDMON_H_void InitSpeedMonitor(void);void ClearSpeedMonitor(void);void GetRASSpeed(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT);////参数:每秒发送,每秒接收,总发送,总接受#endif

CPP文件rasSpdM.cpp

#include "stdafx.h"#include "rasSpdM.h"#include #define TOTALBYTES    4096#define BYTEINCREMENT 1024LPSTR lpNameStrings=NULL;LPSTR *lpNamesArray=NULL;BOOL glo_fFromDynReg=TRUE;/*在9x下通过dyn_data注册表得到速度*/DWORD GetTotalRecv(void){HKEY hKey;DWORD dwValue=(DWORD)-1;if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\StatData",&hKey)){DWORD dwType,dwLen=sizeof(DWORD);RegQueryValueEx(hKey,"Dial-Up Adapter\TotalBytesRecvd",NULL,&dwType,(BYTE*)&dwValue,&dwLen);RegCloseKey(hKey);}return dwValue;}DWORD GetTotalXmit(void){HKEY hKey;DWORD dwValue=(DWORD)-1;if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\StatData",&hKey)){DWORD dwType,dwLen=sizeof(DWORD);RegQueryValueEx(hKey,"Dial-Up Adapter\TotalBytesXmit",NULL,&dwType,(BYTE*)&dwValue,&dwLen);RegCloseKey(hKey);}return dwValue;}DWORD GetPerSecondRecv(void){HKEY hKey;DWORD dwValue=(DWORD)-1;if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\StatData",&hKey)){DWORD dwType,dwLen=sizeof(DWORD);RegQueryValueEx(hKey,"Dial-Up Adapter\BytesRecvd",NULL,&dwType,(BYTE*)&dwValue,&dwLen);RegCloseKey(hKey);}return dwValue;}DWORD GetPerSecondXmit(void){HKEY hKey;DWORD dwValue=(DWORD)-1;if(0==RegOpenKey(HKEY_DYN_DATA,"PerfStats\StatData",&hKey)){DWORD dwType,dwLen=sizeof(DWORD);RegQueryValueEx(hKey,"Dial-Up Adapter\BytesXmit",NULL,&dwType,(BYTE*)&dwValue,&dwLen);RegCloseKey(hKey);}return dwValue;}/*****************************************************************在NT下通过per Data得到 *****************************************************************/PPERF_OBJECT_TYPE FirstObject( PPERF_DATA_BLOCK PerfData ){    return( (PPERF_OBJECT_TYPE)((PBYTE)PerfData +         PerfData->HeaderLength) );}PPERF_OBJECT_TYPE NextObject( PPERF_OBJECT_TYPE PerfObj ){    return( (PPERF_OBJECT_TYPE)((PBYTE)PerfObj +         PerfObj->TotalByteLength) );}PPERF_INSTANCE_DEFINITION FirstInstance( PPERF_OBJECT_TYPE PerfObj ){    return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfObj +         PerfObj->DefinitionLength) );}PPERF_INSTANCE_DEFINITION NextInstance(     PPERF_INSTANCE_DEFINITION PerfInst ){    PPERF_COUNTER_BLOCK PerfCntrBlk;    PerfCntrBlk = (PPERF_COUNTER_BLOCK)((PBYTE)PerfInst +         PerfInst->ByteLength);    return( (PPERF_INSTANCE_DEFINITION)((PBYTE)PerfCntrBlk +         PerfCntrBlk->ByteLength) );}PPERF_COUNTER_DEFINITION FirstCounter( PPERF_OBJECT_TYPE PerfObj ){    return( (PPERF_COUNTER_DEFINITION) ((PBYTE)PerfObj +         PerfObj->HeaderLength) );}PPERF_COUNTER_DEFINITION NextCounter(     PPERF_COUNTER_DEFINITION PerfCntr ){    return( (PPERF_COUNTER_DEFINITION)((PBYTE)PerfCntr +         PerfCntr->ByteLength) );}/***************************************************************** *                                                               * * Load the counter and object names from the registry to the    * * global variable lpNamesArray.                                 * *                                                               * *****************************************************************/void GetNameStrings( ){    HKEY hKeyPerflib;      // handle to registry key    HKEY hKeyPerflib009;   // handle to registry key    DWORD dwMaxValueLen;   // maximum size of key values    DWORD dwBuffer;        // bytes to allocate for buffers    DWORD dwBufferSize;    // size of dwBuffer    LPSTR lpCurrentString; // pointer for enumerating data strings    DWORD dwCounter;       // current counter index// Get the number of Counter items.    RegOpenKeyEx( HKEY_LOCAL_MACHINE,        "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib",        0,        KEY_READ,        &hKeyPerflib);    dwBufferSize = sizeof(dwBuffer);    RegQueryValueEx( hKeyPerflib,        "Last Counter",        NULL,        NULL,        (LPBYTE) &dwBuffer,        &dwBufferSize );    RegCloseKey( hKeyPerflib );// Allocate memory for the names array.    lpNamesArray = (char**)malloc( (dwBuffer+1) * sizeof(LPSTR) );// Open key containing counter and object names.    RegOpenKeyEx( HKEY_LOCAL_MACHINE,    "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009",        0,        KEY_READ,        &hKeyPerflib009);// Get the size of the largest value in the key (Counter or Help).    RegQueryInfoKey( hKeyPerflib009,        NULL,        NULL,        NULL,        NULL,        NULL,        NULL,        NULL,        NULL,        &dwMaxValueLen,        NULL,        NULL);// Allocate memory for the counter and object names.    dwBuffer = dwMaxValueLen + 1;    lpNameStrings = (char*)malloc( dwBuffer * sizeof(CHAR) );// Read Counter value.    RegQueryValueEx( hKeyPerflib009,        "Counter",        NULL,        NULL,        (BYTE*)lpNameStrings, &dwBuffer );// Load names into an array, by index.    int iC=1;for( lpCurrentString = lpNameStrings; *lpCurrentString;         lpCurrentString += (lstrlen(lpCurrentString)+1) )    {        dwCounter = atol( lpCurrentString );        lpCurrentString += (lstrlen(lpCurrentString)+1);//printf("%d length=%d data=%s",iC++,dwCounter,lpCurrentString);        lpNamesArray[dwCounter] = (LPSTR) lpCurrentString;    }}/*****************************************************************得到下RAS速度 *****************************************************************/void GetRASSpeedOn9X(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT){// under 9x*pTPS=GetPerSecondXmit();*pRPS=GetPerSecondRecv();*pTT=GetTotalXmit();*pRT=GetTotalRecv();}void GetRASSpeedOnNT(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT){// under NT////参数:每秒发送,每秒接收,总发送,总接受    PPERF_DATA_BLOCK PerfData = NULL;    PPERF_OBJECT_TYPE PerfObj;    PPERF_INSTANCE_DEFINITION PerfInst;    PPERF_COUNTER_DEFINITION PerfCntr, CurCntr;    PPERF_COUNTER_BLOCK PtrToCntr;    DWORD BufferSize = TOTALBYTES;    DWORD i, j, k;// Get the name strings through the registry.//return;// Allocate the buffer for the performance data.    PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );    while( RegQueryValueEx( HKEY_PERFORMANCE_DATA,                               "906",//"Global",                               NULL,                               NULL,                               (LPBYTE) PerfData,                               &BufferSize ) == ERROR_MORE_DATA )    {    // Get a buffer that is big enough.        BufferSize += BYTEINCREMENT;        PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );    }// Get the first object type.    PerfObj = FirstObject( PerfData );// Process all objects.    //printf("object total=%d",PerfData->NumObjectTypes);//getchar();for( i=0; i < PerfData->NumObjectTypes; i++ )    {    // Display the object by index and name.    // Get the first counter.        PerfCntr = FirstCounter( PerfObj );        if( PerfObj->NumInstances > 0 )        {//exit(0);        }        else        {        // Get the counter block.            PtrToCntr = (PPERF_COUNTER_BLOCK) ((PBYTE)PerfObj +                            PerfObj->DefinitionLength );        // Retrieve all counters.            for( j=0; j < PerfObj->NumCounters; j++ )            {            // Display the counter by index and name.               if(strcmp("Bytes Transmitted/Sec",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0){*pTPS=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));}if(strcmp("Bytes Received/Sec",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0){*pRPS=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));}                if(strcmp("Bytes Transmitted",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0){*pTT=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));}                if(strcmp("Bytes Received",lpNamesArray[PerfCntr->CounterNameTitleIndex])==0){*pRT=*((DWORD*)((BYTE*)PtrToCntr+PerfCntr->CounterOffset));}// Get the next counter.PerfCntr = NextCounter( PerfCntr );}}    // Get the next object type.        PerfObj = NextObject( PerfObj );    }}void GetRASSpeed(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT){////参数:每秒发送,每秒接收,总发送,总接受if(glo_fFromDynReg==FALSE){GetRASSpeedOnNT(pTPS,pRPS, pTT,pRT);}else{GetRASSpeedOn9X(pTPS,pRPS, pTT,pRT);}}void InitSpeedMonitor(void){DWORD dwVersion = GetVersion();// Get major and minor version numbers of WindowsDWORD dwWindowsMajorVersion =  (DWORD)(LOBYTE(LOWORD(dwVersion)));DWORD dwWindowsMinorVersion =  (DWORD)(HIBYTE(LOWORD(dwVersion)));// Get build numbers for Windows NT or Win32sif (dwVersion>>31 ==0)                // Windows NT{glo_fFromDynReg=FALSE;GetNameStrings( );}else         // Windows 95 - 98glo_fFromDynReg=TRUE;}void ClearSpeedMonitor(void){if(lpNameStrings)free(lpNameStrings);if(lpNamesArray)free(lpNamesArray);}

使用方法:

#include "rasSpdM.h"BOOL CYourApp::InitInstance(){//初始化RAS速度访问InitSpeedMonitor();...}#include "rasSpdM.h"void CYourWnd::OnTimer(UINT nIDEvent) {DWORD dwR,dwS,dwPSR,dwPSS;//总接收,总发送,每秒接收,每秒发送GetRASSpeed(&dwPSS,&dwPSR,&dwS,&dwR);//pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT)//参数:每秒发送,每秒接收,总发送,总接收...}

但我在使用过程中发现每秒发送,每秒接收这两个结果并不十分正确,所以我是采用总数相减的方式来计算每秒速度的。


Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:24,000.00000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号