亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mfnettraffic.cpp

?? vc++網絡編程教程的源碼。可能對使用vc網絡編程的有用。
?? CPP
字號:

#include "stdafx.h"
#include "MFNetTraffic.h"
#include "float.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

#include "winperf.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

MFNetTraffic::MFNetTraffic()
{
	lasttraffic = 0.0;
	CurrentInterface = -1;
	CurrentTrafficType = AllTraffic;
	GetInterfaces();
}

MFNetTraffic::~MFNetTraffic()
{
	
}


PERF_OBJECT_TYPE *FirstObject(PERF_DATA_BLOCK *dataBlock)
{
  return (PERF_OBJECT_TYPE *) ((BYTE *)dataBlock + dataBlock->HeaderLength);
}

PERF_OBJECT_TYPE *NextObject(PERF_OBJECT_TYPE *act)
{
  return (PERF_OBJECT_TYPE *) ((BYTE *)act + act->TotalByteLength);
}

PERF_COUNTER_DEFINITION *FirstCounter(PERF_OBJECT_TYPE *perfObject)
{
  return (PERF_COUNTER_DEFINITION *) ((BYTE *) perfObject + perfObject->HeaderLength);
}

PERF_COUNTER_DEFINITION *NextCounter(PERF_COUNTER_DEFINITION *perfCounter)
{
  return (PERF_COUNTER_DEFINITION *) ((BYTE *) perfCounter + perfCounter->ByteLength);
}

PERF_COUNTER_BLOCK *GetCounterBlock(PERF_INSTANCE_DEFINITION *pInstance)
{
  return (PERF_COUNTER_BLOCK *) ((BYTE *)pInstance + pInstance->ByteLength);
}

PERF_INSTANCE_DEFINITION *FirstInstance (PERF_OBJECT_TYPE *pObject)
{
  return (PERF_INSTANCE_DEFINITION *)  ((BYTE *) pObject + pObject->DefinitionLength);
}

PERF_INSTANCE_DEFINITION *NextInstance (PERF_INSTANCE_DEFINITION *pInstance)
{
  PERF_COUNTER_BLOCK  *pCtrBlk = GetCounterBlock(pInstance);

  return (PERF_INSTANCE_DEFINITION *) ((BYTE *)pInstance + pInstance->ByteLength + pCtrBlk->ByteLength);
}

char *WideToMulti(wchar_t *source, char *dest, int size)
{
  WideCharToMultiByte(CP_ACP, 0, source, -1, dest, size, 0, 0);

  return dest;
}
/*
Window NT/2000: When calling the RegQueryValueEx function with hKey set to the 
HKEY_PERFORMANCE_DATA handle and a value string of a specified object, the 
returned data structure sometimes has unrequested objects. Don't be surprised;
this is normal behavior. When calling the RegQueryValueEx function, you should 
always expect to walk the returned data structure to look for the requested object. 
*/
//得到接口號為interfaceNumber的接口流量
double MFNetTraffic::GetTraffic(int interfaceNumber)
{
	try
	{
#define DEFAULT_BUFFER_SIZE 40960L
		
		POSITION pos;
		CString InterfaceName;
		pos = Interfaces.FindIndex(interfaceNumber);
		if(pos==NULL)
			return 0.0;
		//得到當前的接口名字
		InterfaceName = Interfaces.GetAt(pos);
		
		//為性能數據緩沖
		unsigned char *data = new unsigned char [DEFAULT_BUFFER_SIZE];
		// 從RegQueryValueEx返回的值:本例中忽略改變量
		DWORD type;
		// 緩沖的尺寸
		DWORD size = DEFAULT_BUFFER_SIZE;
		// RegQueryValueEx返回的值
		DWORD ret;
		
		// 從網絡對象(索引是510)查詢性能數據
		/*
		HKEY_PERFORMANCE_DATA:
		Windows NT/2000/XP: Registry entries subordinate to this key allow you to 
		access performance data. The data is not actually stored in the registry; 
		the registry functions cause the system to collect the data from its source.
		*/
		/*
		*/
		while((ret = RegQueryValueEx(
			HKEY_PERFORMANCE_DATA, "510", NULL, &type, data, &size)) != ERROR_SUCCESS) 
		{
			if(ret == ERROR_MORE_DATA) 
			{
				// 緩沖尺寸太小,增加內存分配
				size += DEFAULT_BUFFER_SIZE;		
				delete [] data;
				data = new unsigned char [size];
			} 
			else 
			{
				// 未定義的錯誤
				return 1;
			}
		}
		//性能數據塊
		PERF_DATA_BLOCK *dataBlockPtr = (PERF_DATA_BLOCK *)data;
		
		//枚舉鏈表中第一個對象
		PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr);
		
		//遍歷鏈表 
		for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++) 
		{
			char nameBuffer[255];
		
			// 判斷是否是網絡對象索引號是510
			if(objectPtr->ObjectNameTitleIndex == 510) 
			{
				// 偏移變量
				DWORD processIdOffset = ULONG_MAX;
				// 找到第一個計數器
				PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);
				// 遍歷鏈表
				for(int b=0 ; b<(int)objectPtr->NumCounters ; b++) 
				{
					// 判斷接收的數據類型是否是我們需要的
					if((int)counterPtr->CounterNameTitleIndex == CurrentTrafficType)
						processIdOffset = counterPtr->CounterOffset;
			
					// 下一個計數器
					counterPtr = NextCounter(counterPtr);
				}

				//數據類型不是我們需要的
				if(processIdOffset == ULONG_MAX) {
					delete [] data;
					return 1;
				}
				
				// 找到第一個實列(instance)
				PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr);
				
				DWORD fullTraffic;
				DWORD traffic;
				//遍歷整個實列
				for(b=0 ; b<objectPtr->NumInstances ; b++) 
				{
					wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);		
					// 得到這個實列的PERF_COUNTER_BLOCK
					PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr);
					
					// 現在我們得到了接口的名字
					char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer));
					CString iName;
					iName.Format("%s",pName);
				
					POSITION pos = TotalTraffics.FindIndex(b);
					if(pos!=NULL)
					{
						fullTraffic = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));
						TotalTraffics.SetAt(pos,fullTraffic);
					}

					// 如果當前的接口就是我們選擇的接口
					if(InterfaceName == iName)
					{
						traffic = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));
						double acttraffic = (double)traffic;
						double trafficdelta;
						// 判斷處理的接口是否是新的
						if(CurrentInterface != interfaceNumber)
						{
							lasttraffic = acttraffic;
							trafficdelta = 0.0;
							CurrentInterface = interfaceNumber;
						}
						else
						{
							trafficdelta = acttraffic - lasttraffic;
							lasttraffic = acttraffic;
						}
						delete [] data;
						return(trafficdelta);
					}
					
					//下一個實列
					instancePtr = NextInstance(instancePtr);
				}
			}
			
			// 下一個對象
			objectPtr = NextObject(objectPtr);
		}
		
		delete [] data;
		return 0;
	}

	catch(...)
	{
		return 0;
	}
}

//枚舉安裝的接口
BOOL MFNetTraffic::GetInterfaces()
{
	try
	{
#define DEFAULT_BUFFER_SIZE 40960L
		
		Interfaces.RemoveAll();
		unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE);
		DWORD type;
		DWORD size = DEFAULT_BUFFER_SIZE;
		DWORD ret;
		
		char s_key[4096];
		sprintf( s_key , "%d" , 510 );
		//RegQueryValueEx的固定調用格式		
		while((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, s_key, 0, &type, data, &size)) != ERROR_SUCCESS) {
			while(ret == ERROR_MORE_DATA) 
			{
				size += DEFAULT_BUFFER_SIZE;
				data = (unsigned char*) realloc(data, size);
			} 
			if(ret != ERROR_SUCCESS)
			{
				return FALSE;
			}
		}
		//得到數據塊		
		PERF_DATA_BLOCK	 *dataBlockPtr = (PERF_DATA_BLOCK *)data;
		//得到第一個對象
		PERF_OBJECT_TYPE *objectPtr = FirstObject(dataBlockPtr);
		
		for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++) 
		{
			char nameBuffer[255];
			if(objectPtr->ObjectNameTitleIndex == 510) 
			{
				DWORD processIdOffset = ULONG_MAX;
				PERF_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);
				
				for(int b=0 ; b<(int)objectPtr->NumCounters ; b++) 
				{
					if(counterPtr->CounterNameTitleIndex == 520)
						processIdOffset = counterPtr->CounterOffset;
					
					counterPtr = NextCounter(counterPtr);
				}
				
				if(processIdOffset == ULONG_MAX) {
					free(data);
					return 1;
				}
				
				PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr);
				
				for(b=0 ; b<objectPtr->NumInstances ; b++) 
				{
					wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);
					PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr);
					char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer));
					DWORD bandwith = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));				
					DWORD tottraff = 0;

					Interfaces.AddTail(CString(pName));
					Bandwidths.AddTail(bandwith);
					TotalTraffics.AddTail(tottraff);  // initial 0, just for creating the list
					
					instancePtr = NextInstance(instancePtr);
				}
			}
			objectPtr = NextObject(objectPtr);
		}
		free(data);
		
		return TRUE;
	}
	catch(...)
	{
		return FALSE;
	}
}

//返回安裝的接口數
int MFNetTraffic::GetNetworkInterfacesCount()
{
	return Interfaces.GetCount()-1;
}


//返回接口名稱
BOOL MFNetTraffic::GetNetworkInterfaceName(CString *InterfaceName, int index)
{
	POSITION pos = Interfaces.FindIndex(index);
	if(pos==NULL)
		return FALSE;

	InterfaceName->Format("%s",Interfaces.GetAt(pos));
	return TRUE;
}


//返回接口帶寬
DWORD MFNetTraffic::GetInterfaceBandwidth(int index)
{
	POSITION pos = Bandwidths.FindIndex(index);
	if(pos==NULL)
		return 0;

	else 
		return Bandwidths.GetAt(pos) / 8;

}

//具體接口接收和發送的數據量
DWORD MFNetTraffic::GetInterfaceTotalTraffic(int index)
{
	DWORD		totaltraffic = 0;
	POSITION	pos;
	pos= TotalTraffics.FindIndex(index);
	if(pos!=NULL)
	{
		totaltraffic = TotalTraffics.GetAt(pos); 
		if(totaltraffic == 0.0)
		{
			GetTraffic(index);
			pos= TotalTraffics.FindIndex(index);
			if(pos!=NULL)
			{
				totaltraffic = TotalTraffics.GetAt(pos); 
			}
		}
	}

	return(totaltraffic);
}
void MFNetTraffic::SetTrafficType(int trafficType)
{
	CurrentTrafficType = trafficType;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一品视频| 欧美亚洲日本一区| 精品88久久久久88久久久| 色94色欧美sute亚洲线路一久 | 亚洲黄色在线视频| 亚洲成人自拍一区| 69堂国产成人免费视频| 色综合一区二区三区| 国产精品私房写真福利视频| 精品亚洲欧美一区| 久久新电视剧免费观看| 国产成人精品三级麻豆| 中文字幕日韩av资源站| 色综合久久中文综合久久97| 国产伦理精品不卡| 久久精品国产久精国产| 激情欧美一区二区| 国产精品一区二区在线观看网站| 国产在线视视频有精品| 精品午夜一区二区三区在线观看| 日韩精品免费专区| 亚洲一区二区三区爽爽爽爽爽| 国产日韩欧美精品一区| 国产午夜亚洲精品不卡| 最新国产精品久久精品| 亚洲乱码一区二区三区在线观看| 亚洲综合免费观看高清在线观看| 亚洲福利国产精品| 蜜臀99久久精品久久久久久软件| 国产一区久久久| 色偷偷久久一区二区三区| 欧美精品九九99久久| 精品久久久久久久久久久久久久久久久 | 国产成人精品三级麻豆| 亚洲一区在线观看网站| 亚洲国产欧美日韩另类综合| 欧美日韩亚洲综合一区二区三区| 99久久精品国产导航| 欧美男男青年gay1069videost| 日本亚洲免费观看| 专区另类欧美日韩| 制服.丝袜.亚洲.另类.中文| 国产又黄又大久久| 亚洲激情第一区| 日韩写真欧美这视频| 成人午夜激情影院| 亚洲蜜桃精久久久久久久| 国产乱码一区二区三区| 日韩限制级电影在线观看| 亚洲天堂成人在线观看| 99国产精品国产精品毛片| 欧美日韩一区二区三区四区| 欧美一区二区三区日韩视频| 亚洲国产精品黑人久久久| 亚洲国产乱码最新视频| 91高清视频在线| 久久综合九色综合久久久精品综合| 一区二区免费视频| 91国产福利在线| 午夜视频一区二区三区| 91农村精品一区二区在线| 国产精品乱码人人做人人爱| 国产成人精品三级| 亚洲人成在线播放网站岛国| 成人久久视频在线观看| 亚洲麻豆国产自偷在线| 99re这里都是精品| 亚洲国产精品久久久男人的天堂 | 国产精品美女久久久久久久久| 日本免费在线视频不卡一不卡二| 日韩免费看网站| 国产精品大尺度| 免费视频最近日韩| 精品日韩在线一区| 国内一区二区在线| 午夜一区二区三区视频| 国产精品亚洲综合一区在线观看| 天堂一区二区在线| 亚洲视频一区二区免费在线观看| 国产精品视频一二三区| 日韩精品专区在线| 日韩一级完整毛片| 2欧美一区二区三区在线观看视频| 欧美三级午夜理伦三级中视频| 91免费观看视频| 99久久99久久精品免费观看| 丁香一区二区三区| 人妖欧美一区二区| 一区二区三区免费观看| 欧美日韩国产123区| 国产一区二区三区在线看麻豆 | 欧美一级高清片| 国产精品99久久久| 国产欧美日韩综合精品一区二区| 国产成人一级电影| 日韩在线一二三区| 成人免费在线视频| 日韩视频免费观看高清完整版| 成人黄色av电影| 久久激情综合网| 亚洲成av人**亚洲成av**| 久久综合久久99| 精品久久久久久久人人人人传媒 | 91福利在线导航| 精品在线播放午夜| 日本亚洲免费观看| 午夜精品久久久久久久蜜桃app| 亚洲一区电影777| 亚洲综合激情另类小说区| 五月天久久比比资源色| 亚洲免费观看高清| 日韩一级大片在线观看| 99久久精品国产精品久久| 成人av午夜电影| 欧美日韩黄色一区二区| 亚洲chinese男男1069| 欧美一区二区日韩| 国产偷国产偷亚洲高清人白洁| 久久免费美女视频| 国产精品久久久久国产精品日日| 国产精品久久久久婷婷二区次| 一区二区三区精密机械公司| 久久精品国产精品亚洲精品 | 亚洲人成影院在线观看| 中文字幕欧美一区| 韩国av一区二区| 国产成人三级在线观看| www.色精品| 精品污污网站免费看| 欧美久久久久久蜜桃| 4438x亚洲最大成人网| 欧美精品在线一区二区三区| 欧美一级欧美三级在线观看 | 91精品国产综合久久香蕉麻豆| 性欧美大战久久久久久久久| 中文字幕亚洲在| 国产欧美日韩另类一区| 日韩影院在线观看| 高清视频一区二区| 99久久精品国产观看| 国产日韩欧美精品综合| 亚洲成人在线网站| 91免费版pro下载短视频| 日韩一区二区三区视频| 日本一区二区免费在线观看视频| 亚洲h精品动漫在线观看| 成人h动漫精品一区二| 久久久午夜精品| 视频一区二区欧美| 成人不卡免费av| 国产午夜精品一区二区| 日本亚洲三级在线| 欧美天堂亚洲电影院在线播放| 久久久www成人免费毛片麻豆| 精品国产网站在线观看| 午夜精品视频在线观看| 99久久综合99久久综合网站| 国产日韩欧美制服另类| 免费成人在线播放| 色呦呦网站一区| 亚洲欧美日韩在线不卡| 国产成人日日夜夜| 一区二区高清视频在线观看| 成人听书哪个软件好| 欧美国产97人人爽人人喊| 国产东北露脸精品视频| 久久一夜天堂av一区二区三区| 日韩影院精彩在线| 欧美性色黄大片| 亚洲一区二区三区四区五区中文| 国产制服丝袜一区| 亚洲一区二区综合| wwww国产精品欧美| 精品久久一区二区三区| 亚洲高清久久久| 欧美色涩在线第一页| 亚洲日本在线看| 色噜噜偷拍精品综合在线| 国产精品高潮呻吟| 亚洲老妇xxxxxx| 日韩限制级电影在线观看| 蜜桃精品视频在线| 国产精品白丝在线| 欧美一区二区在线看| 欧美色窝79yyyycom| 日韩av电影天堂| 国产精品美女www爽爽爽| 在线精品视频一区二区三四| 久久精品国产在热久久| 1区2区3区精品视频| 日韩亚洲欧美综合| 色拍拍在线精品视频8848| 日韩电影在线一区二区三区| 国产欧美一区二区精品仙草咪| 色视频欧美一区二区三区| 日本美女一区二区三区| 国产精品网站一区| 99久久久久免费精品国产| 精品在线视频一区| 日日夜夜免费精品|