資源簡介
用c++編寫一個流量統計系統
為了方便網絡編程,90年代初,由Microsoft聯合了其他幾家公司共同制定了一套WINDOWS下的網絡編程接口,即Windows Sockets規范,它不是一種網絡協議,而是一套開放的、支持多種協議的Windows下的網絡編程接口。本篇論文主要是介紹了在TCP/IP基礎上利用winsock2對網卡進行編程,以達到網絡流量監測的目的。論文首先介紹了TCP/IP協議,旨在介紹IP,TCP,UDP等比較重要的協議。主要是介紹IP頭,TCP頭,UDP頭的特點,以便從IP頭中可以獲取源地址,目的地址,協議類型等信息。在隨后的章節中提出了Socket的概念,Socket實際上提供了一個通信端口使所有擁有Socket的端口的計算機之間能夠相互通信,在本論文中主要說明了socket的建立,監聽和撤銷的過程。具體到程序實現中,對網卡混雜模式的設置是通過原始套接字(raw socket)來實現的。為了讓原始套接字能接受所有的數據,還需要通過將SOCK_RAW設置成SIO_RCVALL。對數據包的獲取通過recv()函數來完成。最后要完成的工作就是對所捕獲的IP數據包進行分析以提取出我們所需要的信息。在論文的最后是旨在說明進一步工作的展開。
關鍵字: TCP/IP,Winsock,原始套接字,NetBios

代碼片段和文件信息
#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?per
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
????.......???????615??2003-07-12?10:21??NetTraffic\Globals.h
????.......??????9567??2003-07-13?21:35??NetTraffic\MFNetTraffic.cpp
????.......??????1334??2003-07-12?12:32??NetTraffic\MFNetTraffic.h
????.......??????2188??2003-07-13?19:16??NetTraffic\MemDC.h
????.......?????21960??2005-07-18?23:42??NetTraffic\NetTrafficButton.aps
????.......??????1441??2005-07-18?23:42??NetTraffic\NetTrafficButton.clw
????.......???????943??2003-07-12?19:14??NetTraffic\NetTrafficButton.cpp
????.......??????4742??2003-07-12?11:02??NetTraffic\NetTrafficButton.dsp
????.......???????585??2001-10-31?19:53??NetTraffic\NetTrafficButton.dsw
????.......???????831??2003-07-03?14:44??NetTraffic\NetTrafficButton.h
????.......????156672??2005-07-18?23:42??NetTraffic\NetTrafficButton.ncb
????.......?????59904??2005-07-18?23:42??NetTraffic\NetTrafficButton.opt
????.......??????2988??2005-07-18?23:42??NetTraffic\NetTrafficButton.plg
????.......??????6307??2003-07-13?19:19??NetTraffic\NetTrafficButton.rc
????.......??????4917??2003-07-12?20:32??NetTraffic\NetTrafficButtonDlg.cpp
????.......??????1181??2003-07-12?20:19??NetTraffic\NetTrafficButtonDlg.h
????.......??????4290??2001-10-31?19:53??NetTraffic\ReadMe.txt
????.......????????29??2003-07-12?19:36??NetTraffic\StdAfx.cpp
????.......???????505??2003-07-03?14:35??NetTraffic\StdAfx.h
????.......?????14818??2003-07-12?20:01??NetTraffic\mftrafficbutton.cpp
????.......??????3017??2003-07-12?10:51??NetTraffic\mftrafficbutton.h
????.......???????832??2003-07-12?20:18??NetTraffic\resource.h
????.......??????1078??2003-07-12?10:02??NetTraffic\res\Mainfr
????.......??????1078??2003-07-12?10:02??NetTraffic\res\NetTrafficButton.ico
????.......???????432??2001-10-31?19:53??NetTraffic\res\NetTrafficButton.rc2
?????目錄??????????0??2006-06-26?11:01??NetTraffic\res
?????目錄??????????0??2006-06-26?11:01??NetTraffic\Debug
?????目錄??????????0??2006-06-26?11:01??NetTraffic
-----------?---------??----------?-----??----
???????????????302472????????????????????29
............此處省略2個文件信息
- 上一篇:C語言語法分析程序編譯原理:LR
- 下一篇:c++課程設計學生考勤系統
評論
共有 條評論