监控IP包流量05062124(吴文强)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌航空大学计算机学院
课程设计说明书
课程名称:计算机网络课程设计
设计题目:监控IP包流量
专业:网络工程班级: 050621 姓名:吴文强学号: 24
评分:指导教师:周之平邓林生
2008 年 6 月 29 日
一.课程设计目的
随着Internet技术的发展,基于IP协议的网络应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层的基本概念,了解IP 协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的。通过本课程设计,有助于熟悉IP包格式和加深对IP协议的理解。
二.需求分析
1.编制程序,监控网络,捕获一段时间内网络上IP数据包,按IP 数据包的源地址统计出该源地址在该时间内发出的IP包个数,将其写入日志文件中或用图形表示出来。
2.设计可视化图形界面,可以进行捕获操作和停止操作,并且捕获完成后有统计结果显示和日志文件生成。
3.程序设计采用C++或者Java(本次设计决定采用C++)。
三.概要设计
本次课程设计的主要目的是接收统计IP包,所以主要任务就是设置网卡以及相关的一系列操作,而图形界面的设计要求次之,所以主要介绍下我门对接收统计IP包的一些设计:
⑴定义一些用于存储所要记录的源地址和该源地址发出的包的个数的结构体以及链表;
⑵主要是查找网卡,设置网卡为混杂模式,编辑过滤器,设置过滤器;
⑶捕获IP数据包并按包的源地址进行统计(存入链表中)。
程序流程图如下:
图1程序流程图
四.详细设计及编码
(1)新建一个基于对话框的MFC AppWizard[exe]工程,取名为IPStatistic。在IDD_IPSTATISTIC_DIALOG中加入界面所需要的控件,所加的控件从上到下依次有静态文本取名为网卡列表,下拉列表框(定义变量为m_comboboxx),静态文本取名为捕获包个数,静态文本(设置ID为IDC_CLOCK,用于显示捕获的包个数),开始捕获按钮,停止按钮,退出按钮,静态文本(设置ID为IDC_STATE,用于表示当前状态),一个组合框(取名为统计结果如下:), 一个清空列表按钮,最后一个是列表控制框(用于显示最后捕获的数据统计),此时的界面如下图:
图2 初始化界面
(2)向工程里添加C++头文件,命名为IPNodeList(存储结构接点和链表的定义),代码如下:
//IP结点类,存放IP包的源IP地址和其它发送数据包个数
class IPNode
{private:
long m_lIPAddress; //IP地址
long m_lCount; //发送数据包数
public:
IPNode * pNext;
//构造函数
IPNode(long sourceIP)
{m_lIPAddress=sourceIP;
m_lCount=1; //初始化数据包个数为1
}
void addCount()
{m_lCount++;
//返回数据包个数
long getCount()
{return m_lCount;
}
//返回IP地址
long getIPAddress()
{return m_lIPAddress;
}
};
//结点链表
class NodeList
{IPNode * pHead; //链表头
IPNode * pTail; //链表尾
public:
NodeList()
{pHead=pTail=NULL;
}
~NodeList()
{if(pHead!=NULL)
{IPNode * pTemp=pHead;
pHead=pHead->pNext;
delete pTemp;
}
}
//将IP结点加入链表
void addNode(long sourceIP)
{if(pHead==NULL) //当链表为空时
{pTail=new IPNode(sourceIP);
pHead=pTail;
pTail->pNext=NULL;
}
else //当链表不为空时
{for(IPNode * pTemp=pHead;pTemp;pTemp=pTemp->pNext) {//如果链表中存在此IP,发送数据包个数加1 if(pTemp->getIPAddress()==sourceIP)
{pTemp->addCount();
break;
}
//如果链表中没有此IP,则加入链表
if(pTemp==NULL)
{pTail->pNext=new IPNode(sourceIP);
pTail=pTail->pNext;
pTail->pNext=NULL;
}
}
}
IPNode* GetpHead()
{return pHead;}
};
(3)本次设计需要用到Winpcap软件,必须设置VC的环境,首先下载wpdpack,解压后看到其中包含docs,Includes,lib,Examples等文件,然后打开VC,点击“Tools->Option->Directories”, 在include files添加……\wpdpack\Include目录;在Library files 中添加……\wpdpack\Lib目录
(4)在IPStatisticDlg.cpp中添加下列头文件:
#include "stdafx.h"
#include "IPStatistic.h"
#include "IPStatisticDlg.h"
#include "IPNodeList.h"
#include
#include
#include
#include
#include
#include
#include "pcap.h"
#pragma comment(lib,"Wpcap.lib")
#pragma comment(lib,"Ws2_32.lib")
(5)定义一些程序中将要用的全局变量和IP包的头部结构,如下:
//IP包的头部结构
struct ip_header{
unsigned char ver_ihl;
unsigned char tos;
unsigned short tlen;
unsigned short identification;
unsigned short flags_fo;
unsigned char ttl;