统计当前的modem速率,就象网络蚂蚁中一样,100分 我想倒的办法是,用WinSock2的rawSocket取得所有进出的包,然后就可以统计了不过感觉应该有API直接实现 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 网络蚂蚁只是统计通过它的速率,不是modem的速率。 To Kevin_qinq:问你一个关于rawSocket的问题:自己用rawsocket构造一个ip包,请问其中的id字段和check字段该怎么设置,如果我将check设为0,系统会在我发包时帮我计算马? ID是跟具体协议有关系的,你可以去看看msdn里面的资料,还有可以看看电子工业部的那套TCP/IP(共3卷的).check_sum要自己计算 我觉得有可能在RAS的那套函数里的对于SOCKET来说都是固定的端口是不是要对每一个端口进行扫描呢?当然这只是本人的猜想 不知道能不能用AT命令跟MODEM通信下面是我的MODEM的报告05-24-2001 23:28:43.74 - Intel HaM Data Fax Voice 正在使用。05-24-2001 23:28:43.77 - 调制解调器类型: Intel HaM Data Fax Voice05-24-2001 23:28:43.77 - 调制解调器信息路径: MDMHAM.INF05-24-2001 23:28:43.77 - 调制解调器信息段: HaM05-24-2001 23:28:45.56 - 115200,N,8,105-24-2001 23:28:45.57 - 115200,N,8,105-24-2001 23:28:45.61 - 正在初始化调制解调器。05-24-2001 23:28:45.61 - 发送: AT<cr>05-24-2001 23:28:45.62 - 接收: AT<cr>05-24-2001 23:28:45.77 - 接收: <cr><lf>OK<cr><lf>05-24-2001 23:28:45.77 - 已翻译的响应: 确定05-24-2001 23:28:45.77 - 发送: AT&F E0 Q0 X4 S0=0 &D2 &C1 &S0 V1 W4<cr>05-24-2001 23:28:45.80 - 接收: AT&F E0 Q0 X4 S0=0 &D2 &C1 &S0 V1 W4<cr>05-24-2001 23:28:45.98 - 接收: <cr><lf>OK<cr><lf>05-24-2001 23:28:45.98 - 已翻译的响应: 确定05-24-2001 23:28:45.98 - 发送: ATS7=60S30=0L0M1+ES=3,0,2;%C1+DS=3,0;<cr>05-24-2001 23:28:46.16 - 接收: <cr><lf>OK<cr><lf>05-24-2001 23:28:46.16 - 已翻译的响应: 确定05-24-2001 23:28:46.16 - 发送: AT&K3X4<cr>05-24-2001 23:28:46.35 - 接收: <cr><lf>OK<cr><lf>05-24-2001 23:28:46.35 - 已翻译的响应: 确定05-24-2001 23:28:46.36 - 正在拨号。05-24-2001 23:28:46.36 - 发送: ATDT######<cr>05-24-2001 23:29:13.63 - 接收: <cr><lf>PROTOCOL: LAP-M<cr><lf>05-24-2001 23:29:13.63 - 已翻译的响应: 丰富的资料05-24-2001 23:29:13.63 - 接收: <cr><lf>COMPRESSION: V.42BIS<cr><lf>05-24-2001 23:29:13.63 - 已翻译的响应: 丰富的资料05-24-2001 23:29:13.63 - 接收: <cr><lf>CONNECT 50666<cr><lf>05-24-2001 23:29:13.63 - 已翻译的响应: 连接05-24-2001 23:29:13.63 - 已建立连接的传输速度为 50666bps。05-24-2001 23:29:13.63 - 错误控制打开。05-24-2001 23:29:13.63 - 数据压缩打开。05-24-2001 23:35:31.37 - 正在挂断调制解调器。05-24-2001 23:35:31.37 - 降低 DTR 以挂起硬件。05-24-2001 23:35:32.09 - 接收: <cr><lf>OK<cr><lf>05-24-2001 23:35:32.09 - 已翻译的响应: 确定05-24-2001 23:35:32.09 - 发送: ATH<cr>05-24-2001 23:35:32.44 - 接收: <cr><lf>OK<cr><lf>05-24-2001 23:35:32.44 - 已翻译的响应: 确定05-24-2001 23:35:32.44 - 115200,N,8,105-24-2001 23:35:32.50 - 会话统计:05-24-2001 23:35:32.50 - 读取 : 191668 字节05-24-2001 23:35:32.50 - 写入: 74911 字节05-24-2001 23:35:32.50 - Intel HaM Data Fax Voice 已关闭。 能用AT指令但太复杂了我还是用RAS(REMOTE ACCESS SERVICE)来完成拨号而且HRASCONN也能得到大部分的返回信息 我知道一个很简单的解决方法了,可惜只能在Win98/WinME下用,Winnt/Win2000不能用。不能给自己加分?:-) 我知道一个很简单的解决方法了,可惜只能在Win98/WinME下用,Winnt/Win2000不能用。不能给自己加分?:-) 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);////参数:每秒发送,每秒接收,总发送,总接受#endifCPP文件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\n",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\n",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 Windows DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion))); DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion))); // Get build numbers for Windows NT or Win32s if (dwVersion>>31 ==0) // Windows NT { glo_fFromDynReg=FALSE; GetNameStrings( ); } else // Windows 95 - 98 glo_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) //参数:每秒发送,每秒接收,总发送,总接收...} Thank you,和我的方法一样的:-(,可惜在win2000不能用。有无2000下也能用的方法,我分给了,有好方法我再加分。 MFC对话框 button按钮如何改变颜色??? 如何改变jpg,png图片的相片高度和宽度,并重新保存? SMTP 发送邮件身份验证碰到的问题 关于ActiveX控件的签名问题 在普通IE下打开一张网页,怎样访问其HTML源文件? 请诸位帮忙,关于如何求公切面 ISAPI问题,有人知道吗? 请教高手,关于一个文件输入读出的简单问题,来者给分 应用程序主窗口的创建过程 300两银子没人要吗(winsock问题)? 什么是ATL?我是菜鸟 我该怎么办啊,格式化了也不行!!!!(键盘死锁的问题)Help!
自己用rawsocket构造一个ip包,请问其中的id字段和check字段该怎么设置,如果我将
check设为0,系统会在我发包时帮我计算马?
对于SOCKET来说都是固定的端口
是不是要对每一个端口进行扫描呢?
当然这只是本人的猜想
05-24-2001 23:28:43.74 - Intel HaM Data Fax Voice 正在使用。
05-24-2001 23:28:43.77 - 调制解调器类型: Intel HaM Data Fax Voice
05-24-2001 23:28:43.77 - 调制解调器信息路径: MDMHAM.INF
05-24-2001 23:28:43.77 - 调制解调器信息段: HaM
05-24-2001 23:28:45.56 - 115200,N,8,1
05-24-2001 23:28:45.57 - 115200,N,8,1
05-24-2001 23:28:45.61 - 正在初始化调制解调器。05-24-2001 23:28:45.61 - 发送: AT<cr>
05-24-2001 23:28:45.62 - 接收: AT<cr>
05-24-2001 23:28:45.77 - 接收: <cr><lf>OK<cr><lf>
05-24-2001 23:28:45.77 - 已翻译的响应: 确定
05-24-2001 23:28:45.77 - 发送: AT&F E0 Q0 X4 S0=0 &D2 &C1 &S0 V1 W4<cr>
05-24-2001 23:28:45.80 - 接收: AT&F E0 Q0 X4 S0=0 &D2 &C1 &S0 V1 W4<cr>
05-24-2001 23:28:45.98 - 接收: <cr><lf>OK<cr><lf>
05-24-2001 23:28:45.98 - 已翻译的响应: 确定
05-24-2001 23:28:45.98 - 发送: ATS7=60S30=0L0M1+ES=3,0,2;%C1+DS=3,0;<cr>
05-24-2001 23:28:46.16 - 接收: <cr><lf>OK<cr><lf>
05-24-2001 23:28:46.16 - 已翻译的响应: 确定
05-24-2001 23:28:46.16 - 发送: AT&K3X4<cr>
05-24-2001 23:28:46.35 - 接收: <cr><lf>OK<cr><lf>
05-24-2001 23:28:46.35 - 已翻译的响应: 确定
05-24-2001 23:28:46.36 - 正在拨号。
05-24-2001 23:28:46.36 - 发送: ATDT######<cr>
05-24-2001 23:29:13.63 - 接收: <cr><lf>PROTOCOL: LAP-M<cr><lf>
05-24-2001 23:29:13.63 - 已翻译的响应: 丰富的资料
05-24-2001 23:29:13.63 - 接收: <cr><lf>COMPRESSION: V.42BIS<cr><lf>
05-24-2001 23:29:13.63 - 已翻译的响应: 丰富的资料
05-24-2001 23:29:13.63 - 接收: <cr><lf>CONNECT 50666<cr><lf>
05-24-2001 23:29:13.63 - 已翻译的响应: 连接
05-24-2001 23:29:13.63 - 已建立连接的传输速度为 50666bps。
05-24-2001 23:29:13.63 - 错误控制打开。
05-24-2001 23:29:13.63 - 数据压缩打开。
05-24-2001 23:35:31.37 - 正在挂断调制解调器。
05-24-2001 23:35:31.37 - 降低 DTR 以挂起硬件。
05-24-2001 23:35:32.09 - 接收: <cr><lf>OK<cr><lf>
05-24-2001 23:35:32.09 - 已翻译的响应: 确定
05-24-2001 23:35:32.09 - 发送: ATH<cr>
05-24-2001 23:35:32.44 - 接收: <cr><lf>OK<cr><lf>
05-24-2001 23:35:32.44 - 已翻译的响应: 确定
05-24-2001 23:35:32.44 - 115200,N,8,1
05-24-2001 23:35:32.50 - 会话统计:
05-24-2001 23:35:32.50 - 读取 : 191668 字节
05-24-2001 23:35:32.50 - 写入: 74911 字节
05-24-2001 23:35:32.50 - Intel HaM Data Fax Voice 已关闭。
但太复杂了
我还是用RAS(REMOTE ACCESS SERVICE)来完成拨号
而且HRASCONN也能得到大部分的返回信息
#define __RASSPDMON_H_void InitSpeedMonitor(void);
void ClearSpeedMonitor(void);
void GetRASSpeed(DWORD* pTPS,DWORD* pRPS,DWORD* pTT,DWORD* pRT);
////参数:每秒发送,每秒接收,总发送,总接受
#endifCPP文件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\n",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\n",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 Windows
DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
// Get build numbers for Windows NT or Win32s
if (dwVersion>>31 ==0) // Windows NT
{
glo_fFromDynReg=FALSE;
GetNameStrings( );
}
else // Windows 95 - 98
glo_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)
//参数:每秒发送,每秒接收,总发送,总接收
...
}