资源简介
用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++课程设计学生考勤系统
评论
共有 条评论