计算机网络课程设计监控IP数据包流量.doc

上传人:仙人指路1688 文档编号:2401502 上传时间:2023-02-17 格式:DOC 页数:34 大小:424KB
返回 下载 相关 举报
计算机网络课程设计监控IP数据包流量.doc_第1页
第1页 / 共34页
计算机网络课程设计监控IP数据包流量.doc_第2页
第2页 / 共34页
计算机网络课程设计监控IP数据包流量.doc_第3页
第3页 / 共34页
计算机网络课程设计监控IP数据包流量.doc_第4页
第4页 / 共34页
计算机网络课程设计监控IP数据包流量.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《计算机网络课程设计监控IP数据包流量.doc》由会员分享,可在线阅读,更多相关《计算机网络课程设计监控IP数据包流量.doc(34页珍藏版)》请在三一办公上搜索。

1、四 川 理 工 学 院课 程 设 计 书 学院 计算机学院 专业 计算机科学与技术 班级 题目 监控IP数据包流量 教师 学生 课程设计小组成员及分工本小组成员: xxx yyy zzz分工:xxx 做本课程设计的目的,本课程设计的要求及本课程设计的一些内容yyy 做本课程设计的一些基础知识,本课程设计的分析,本课程设计的结果,本课程设计的总结 zzz 做本课程设计的代码,本课程设计的框架设计,本课程设计的结果验证,本课程设计的逻辑分析。目 录一、 课程设计目的和要求1 1.课程设计目的:1 2.课程设计要求:1二、 课程设计的内容1三、 课程设计核心知识3四、 课程设计框架5五、 课程设计详

2、细分析7六、 实验源代码14七、 课程设计总结30一、 课程设计目的和要求1.课程设计目的: 随着internet技术的发展,基于IP协议的网络应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层的基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的。通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。2.课程设计要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出在该时间段内发出的IP包的个数,将其写入日志文件中并用图形表示出来。 程序的具体要求如下:1.在图形窗口界面下,根据用户输入的捕获时间和选

3、择的网卡输出该段时间内的IP数据包流量分析2.能够将捕获的信息写入日志文件二、 课程设计的内容1.课程设计的内容: 1)使用Winpcap,Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接受原始数据包;2)列出网卡列表,让用户选择可用的网卡;3)使用过滤器捕获IP包,别的包都过滤掉;4)捕获IP包并按包的源地址进行统计(用链表结构进行实现)。5)将统计结果输出到图形窗口界面或输出到日志文件程序流程如图8-1所示。2. 一些必要的基础知识1. 熟悉IP首部格式2. 使用Winpcap工具WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.WinPc

4、ap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能a) 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的b) 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包c) 将原始数据包通过网络发送出去d) 收集并统计网络流量信息使用Winpcap工具主要需要三个步骤: 1).安装底层驱动:在Winpcap官网(www.winpcap.org)下载并安装Winpcap.exe即可2).导入库文件:下载wpdpack开发包,并在开发环境(VC)中导入Lib和Include 文件夹路径。VC导入步骤(工具-选项-目录,分别在Incl

5、ude Files和Library Files中加入/wpdpack/Include和/wpdpack/Lib) 3).在应用程序中导入需要的DLL和头文件:方法一:VC下:工程-设置-链接 在Object/Library modules下添加ws2_32.lib wpcap.lib(注意中间的空格)方法二:在源文件中添加命令处理:#pragma comment(lib, “ws2_32.lib”)#pragma comment(lib, “wpcap.lib”)本程序将会用到的Winpcap功能有:获取本机所有适配器信息 pcap_findalldevs以混杂模式打开适配器pcap_open

6、_live编译并设置过滤器pcap_compile pcap_setfilter捕获数据包 pcap_next_ex释放打开的适配器信息pcap_freealldevs3. VC+图形窗口界面编程包括按钮,编辑框,列表框,列表控件等控件的使用4. 其他相关知识,如文件操作,链表操作等三、 课程设计核心知识1.获取本机网卡信息本课程设计要实现对数据包的捕获,首先就要获取并列出本机上的所有网卡信息,这个功能是通过Winpcap提供的pcap_findalldevs来实现的。该函数原型如下int pcap_findalldevs(pcap_if_t* alldevs, char* errbuf)pc

7、ap_if_t是一个用于描述网卡信息的结构体。里面包含了网卡的名字,描述等信息。通过这个函数可以得到一个网卡信息组成的链表。函数错误则返回-1。2.打开用户选定的网卡得到网卡信息之后,可以通过列表框等形式显示出来,在用户选择后,通过pcap_open_live打开指定网卡:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)函数功能:获得用于捕获网络数据包的数据包捕获描述字。参数说明:device参数为指定打开的网络设备名。snaplen参数定义捕获数据的最大字节数。promi

8、sc指定是否将网络接口置于混杂模式。to_ms参数指*定超时时间(毫秒)。ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。这些参数中最重要的就是promisc参数,通过它可以将网卡监听设置为混杂模式,混杂模式是指不管网卡接收到的数据包是不是发给自己的,都向应用程序上传。这样可以捕获一些广播信息。本程序将监听模式设为混杂模式。3.编译并设置过滤器在打开网卡并得到网卡描述符后,可以编译并设置过滤器。 编译过滤器:int pcap_compile(pcap_t*p,struct bpf_program*fp,char*str,intoptimize, bpf

9、_u_int32netmask)编译一个数据包过滤器,将一个能被核心态(kernel-level)过滤器引擎解释的程序中的高层过滤表达式(filtering expression)进行转化。pcap_compile()被用来将字符串str编译进过滤器程序(fp),程序(fp)是一个指向bpf_program结构体并被pcap_compile()赋值的指针。optimize控制是否对目标代码(resulting code)的性能进行优化。Netmask表明IPv4掩码,它仅在检查过滤器程序中的IPv4广播地址的时候被使用。返回1表示发生了错误,此时,pcap_geterr()将被用来显示错误信息

10、。设置过滤器int pcap_setfilter(pcap_t*p,struct bpf_program* fp)把一个过滤器同一次抓包关联起来。pcap_setfilter被用来指定一个过滤器程序。fp是一个指向bpf_program结构体的指针,通常是pcap_compile()执行的结果。当失败时返回1,此时,pcap_geterr()被用来显示错误信息;返回0表示成功。4.抓包:接下来就是最后一步抓包,Winpcap提供的抓包接口主要有pcap_next_ex和pcap_loop两种pcap_loop直接由数据包捕获驱动所调用,它在底层抓取到包时,直接调用用户传入的处理函数本程序使用另

11、一个函数pcap_next_ex:pcap_next_ex(pcap_t* p,struct pcap_pkthdr* pkt_header,const u_char* pkt_data)功能: 从interface或离线记录文件获取一个报文参数: p: 已打开的捕捉实例的描述符 pkt_header: 报文头 pkt_data: 报文内容返回值: 1: 成功 0: 获取报文超时-1: 发生错误 -2: 获取到离线记录文件的最后一个报文四、 课程设计框架1. 核心流程图:本程序是VC下基于对话框的窗口程序。界面如下:图1主要设计流程如下1. 在OnInitialDialog中获取并显示网卡信息

12、2. 在用户点击开始监听按钮时:a) 验证用户有效输入(验证用户是否输入有效的监控时间,是否选择合适的过滤器,以及是否已选择网卡)b) 以混杂模式打开网卡c) 根据用户在列表框中的选择编译并设置过滤器d) 开始抓取报文,将结果添加到统计链表。并随时检测是否超时。e) 抓取完成之后,将结果输出到列表控件界面f) 在用户关闭窗口或者开始再次监控时提示是否将结果输入日志文件(在用户再次选择监控时,需要清空已有数据)g) 用户关闭窗口时,提示保存日志并释放打开的所有适配器信息五、 课程设计详细分析一、 相关数据结构:1. IP首部结构体IP_HEADERtypedef struct ip_header

13、unsigned char ver_ihl; /版本号以及首部长度unsigned char tos; /区分服务unsigned short totallen; /总长度unsigned short id; /表示unsigned short flags_fragoffset; /标志和片偏移unsigned char ttl; /生存时间unsigned char proto; /协议类型unsigned short crc; /CRC校验DWORD srcaddr;/源IP地址DWORD dstaddr;/目的IP地址unsigned int op_pad;/填充字段IP_HEADER;

14、2. 统计的数据包信息结点CIPNode: 该类对象记录一个类型的数据包并且负责管理其包的数量 class CIPNode public:unsigned char GetProtocol();void AddCount();/增加本节点计数long GetCount();/获取本节点计数long GetIPAddress();/得到本节点IP地址CIPNode(long sourceIP, unsigned char proto);virtual CIPNode();CIPNode* pNext;private:long m_lIPAdress;/源IP地址long m_lcount;/节点

15、计数unsigned char m_proto;/协议类型;3. 统计信息链表类CstatisticsList 该类维护抓取到的数据包链表class CStatisticsList public:void Init();/初始化头尾指针为空CIPNode* GetHead();/得到头指针void AddNode(long ip, unsigned char proto);/添加一个结点 如/果该结点存在 则增加其计数 如果不存在创建并添加该节点CStatisticsList();/创建一个头尾指针均为空的链表virtual CStatisticsList();/释放自身维护的链表privat

16、e:CIPNode* m_pHead;/头指针CIPNode* m_pTail;/尾指针;void CStatisticsList:AddNode(long ip, unsigned char proto)if (m_pHead = NULL)/如果当前链表为空 创建一个节点 初始化头尾指针m_pHead = m_pTail = new CIPNode(ip, proto);m_pTail-pNext = NULL;else/如果链表不为空 BOOL bFind = FALSE;CIPNode* p = NULL;/遍历链表 查找传入的ipfor (p=m_pHead; p; p=p-pNex

17、t)/如果该ip已经存在 则增加其计数if (p-GetIPAddress() = ip & proto = p-GetProtocol()bFind = TRUE;p-AddCount();break;/如果不存在该ip 则添加节点 更新尾指针if (bFind = FALSE)m_pTail-pNext = new CIPNode(ip, proto);m_pTail = m_pTail-pNext;m_pTail-pNext = NULL;CStatisticsList:CStatisticsList()CIPNode* pTemp;/遍历链表 依次释放节点if (m_pHead)pTe

18、mp = m_pHead;m_pHead = m_pHead-pNext;delete pTemp;m_pHead = NULL;m_pTail = NULL;二、 主界面类CIPPackCap逻辑:1. 主要类成员:class CIPPackCapDlg : public CDialogpublic:void ResetData();/在用户重新开始监控时 重新初始化数据void SaveToFile();/将最近一次统计结果保存到指定文件void AskSaveToFile();/询问用户是否保存文件void EnableSomeWindow(BOOL bEnable);/在监控过程中 使

19、输入控件无效void UpdateOutput();/更新统计列表输出BOOL StartListenning();/开始抓取数据包void InitStatisticsListCtrl();/初始化统计列表控件设置void SetTipsInfo(LPCTSTR pszformat, .);/格式化并显示提示消息BOOL SetListenFilter();/设置监控过滤器BOOL OpenSelDev();/打开用户选定的适配器BOOL FindAndShowAllDevs();/查找并显示所有的适配器private:BOOL m_bHadListend;/标志用户是否是第一次监控time

20、_t m_startTime;/最近一次监控的开始时间CStatisticsList m_statisticsList;/存放监控内容的链表pcap_if_t* m_pCurSelDev;/用户选中的适配器pcap_t* m_fpSelDev;/用户选中的适配器描述符int m_iDevsCount;/适配器数目pcap_if_t* m_pAllDevs;/所有适配器指针ofstream m_filestream;/文件流 用于保存记录;2. 初始化:初始化工作在OnInitialDialog中完成: 主要代码:/ 查找并显示所有适配器 如果失败则结束程序 if(!FindAndShowAll

21、Devs()EndDialog(IDOK);/初始化统计列表控件设置InitStatisticsListCtrl();/设置默认过滤器(CComboBox*)GetDlgItem(IDC_COMBO_FILTER)-SetCurSel(0);3. 用户选择开始: 在响应函数OnBtnStart()中void CIPPackCapDlg:OnBtnStart() /如果之前有监听记录 询问是否保存记录到日志文件/并且重置必要数据(统计链表)if (m_bHadListend)AskSaveToFile();ResetData();UpdateData(TRUE);/验证是否输入定时if(m_uL

22、istenTime = 0)MessageBox(请输入你要监控的时间);return;/是否选择有效过滤器if (m_strFilter = )MessageBox(输入你的过滤器);return;/获取并打开用户选择的适配器if (!OpenSelDev()return;/设置监听过滤器if (!SetListenFilter()return;/输出提示信息SetTipsInfo(正在监听:%s, m_pCurSelDev-name);if(StartListenning()/标记已经监听过m_bHadListend = TRUE;GetDlgItem(IDC_TIPS)-SetWindo

23、wText(监听正常结束);/更新输出以及界面UpdateOutput();OnBtnStart是程序的核心部分,其他模块函数都为其服务,当用户非第一次监控时,会调用AskSaveToFile函数,该函数判断用户是否在日志文件编辑框中输入文件名,如果是,则修正该文件名为.txt格式并弹出提示框提醒用户是否将上一次结果保存到日志文件图2.保存日志提示框如果用户选择是,则在AskSaveToFile中调用SaveToFile函数,将记录输出到指定日志文件/*询问是否保存日志文件 如果选择是 调用SaveToFile保存记录到文件*/void CIPPackCapDlg:AskSaveToFile(

24、)/如果日志文件一栏不为空if(m_strOutputFile != )/修正用户文件格式CString strFileExt = m_strOutputFile.Right(4);if (strFileExt != .txt & strFileExt != .TXT)m_strOutputFile+=.txt;/询问用户是否保存CString strTip;strTip.Format(是否将输出保存到你的日志文件: %s, m_strOutputFile);if (IDYES = MessageBox(strTip, 是否保存?, MB_YESNO)SaveToFile();下图3为生成的日

25、志文件:图3.生成的日志文件如果用户选择再次监控,在保存日志文件后,还需要清空已收集的报文包记录和显示界面。这是通过ResetData()来完成的。该函数遍历并释放m_statisticsList所有节点,然后清空列表控件显示。实现参见附源代码之后便开始打开网卡,设置过滤器,然后开始一次新的监听,监听代码如下:/开始在该适配器上不断抓包 并将捕获信息填入到统计链表BOOL CIPPackCapDlg:StartListenning()/使开始按钮和其他输入框不再响应输入EnableSomeWindow(FALSE);/获取开始时间time_t begin_time;time_t now_tim

26、e;:time(&begin_time);m_startTime = begin_time;time_t left_time;struct pcap_pkthdr* ppktheader;unsigned char* ppkt_data;BOOL bNormalExit = FALSE;int ret;while(ret = pcap_next_ex(m_fpSelDev, &ppktheader, &ppkt_data) = 0)/计算并显示剩余时间:time(&now_time);left_time = m_uListenTime - (now_time-begin_time);CStri

27、ng strLeftTime;strLeftTime.Format(%d秒, left_time);GetDlgItem(IDC_TIME_LEFT)-SetWindowText(strLeftTime);if (left_time srcaddr, pheader-proto);return bNormalExit;该函数通pcap_next_ex统计在一段时间内抓取到的报文到m_statisticsList。完成统计之后,通过UpdateOutput()函数更新列表控件m_statisticsCtrl来显示链表中的统计结果。UpdateOutput通过遍历统计链表中的结果,并获取其中的信息

28、输出到表项。通过inet_ntoa将long型IP地址转换为点分十进制的字符串。通过一个switch-case分支来解析节点中的m_proto字段属于何种协议。图4为解析过程界面图5为过滤器为udp时的运行结果:4. 关闭窗口时的处理流程:当用户选择关闭窗口时,在对话框关闭响应函数OnClose中:1.首先检测变量m_bHadListend如果为TRUE。说明用户已经至少监控过一次,调用AskSaveToFile函数。该函数首先判断用户是否输入了日志文件,如果是,则修正文件格式为.txt 之后弹出消息框提示保存并负责调用SaveToFile保存。如果用户未输入日志文件名,则什么也不做。2.调用

29、pcap_freealldevs释放m_pAllDevs中保存的所有适配器信息OnClose函数代码如下:void CIPPackCapDlg:OnClose() /询问是否保存最后一次结果if (m_bHadListend)AskSaveToFile();pcap_freealldevs(m_pAllDevs);CDialog:OnClose();5.其余模块函数可参见附源码。三、四、五、六、 实验源代码/IPNode.h/#if !defined(AFX_IPNODE_H_796BA726_424A_4BD2_AB97_8D188B55AA98_INCLUDED_)#define AFX_

30、IPNODE_H_796BA726_424A_4BD2_AB97_8D188B55AA98_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000class CIPNode public:unsigned char GetProtocol();void AddCount();/增加本节点计数long GetCount();/获取本节点计数long GetIPAddress();/得到本节点IP地址CIPNode(long sourceIP, unsigned char proto);virtual CIPNode();CIPNo

31、de* pNext;private:long m_lIPAdress;/源IP地址long m_lcount;/节点计数unsigned char m_proto;/协议类型;#endif / !defined(AFX_IPNODE_H_796BA726_424A_4BD2_AB97_8D188B55AA98_INCLUDED_)/IPNode.cpp/#include stdafx.h#include IPPackCap.h#include IPNode.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define ne

32、w DEBUG_NEW#endifCIPNode:CIPNode(long sourceIP, unsigned char proto)m_lIPAdress = sourceIP;m_lcount = 1;m_proto = proto;CIPNode:CIPNode()long CIPNode:GetIPAddress()return m_lIPAdress;long CIPNode:GetCount()return m_lcount;void CIPNode:AddCount()m_lcount+;unsigned char CIPNode:GetProtocol()return m_p

33、roto;/StatisticsList.h/#if !defined(AFX_STATISTICSLIST_H_B06D35E9_FCAB_48E5_88FF_BDE53D80FADA_INCLUDED_)#define AFX_STATISTICSLIST_H_B06D35E9_FCAB_48E5_88FF_BDE53D80FADA_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include IPNode.hclass CStatisticsList public:void Init();/初始化头尾指针为空CI

34、PNode* GetHead();/得到头指针void AddNode(long ip, unsigned char proto);/添加一个结点 如果该结点存在 则增加其计数 /如果不存在创建并添加该节点CStatisticsList();virtual CStatisticsList();private:CIPNode* m_pHead;/头指针CIPNode* m_pTail;/尾指针;#endif / !defined(AFX_STATISTICSLIST_H_B06D35E9_FCAB_48E5_88FF_BDE53D80FADA_INCLUDED_)/StatisticsList.

35、cpp/#include stdafx.h#include IPPackCap.h#include StatisticsList.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifCStatisticsList:CStatisticsList()m_pHead = NULL;m_pTail = NULL;CStatisticsList:CStatisticsList()CIPNode* pTemp;/遍历链表 依次释放节点if (m_pHead)pTemp = m_pHea

36、d;m_pHead = m_pHead-pNext;delete pTemp;m_pHead = NULL;m_pTail = NULL;void CStatisticsList:AddNode(long ip, unsigned char proto)if (m_pHead = NULL)/如果当前链表为空 创建一个节点 初始化头尾指针m_pHead = m_pTail = new CIPNode(ip, proto);m_pTail-pNext = NULL;else/如果链表不为空 BOOL bFind = FALSE;CIPNode* p = NULL;/遍历链表 查找传入的ipfor

37、 (p=m_pHead; p; p=p-pNext)/如果该ip已经存在 则增加其计数if (p-GetIPAddress() = ip & proto = p-GetProtocol()bFind = TRUE;p-AddCount();break;/如果不存在该ip 则添加节点 更新尾指针if (bFind = FALSE)m_pTail-pNext = new CIPNode(ip, proto);m_pTail = m_pTail-pNext;m_pTail-pNext = NULL;CIPNode* CStatisticsList:GetHead()return m_pHead;vo

38、id CStatisticsList:Init()m_pHead = NULL;m_pTail = NULL;/IPPackCapDlg.h/#if !defined(AFX_IPPACKCAPDLG_H_682FD3D7_3E3A_4785_B228_62D96973AC09_INCLUDED_)#define AFX_IPPACKCAPDLG_H_682FD3D7_3E3A_4785_B228_62D96973AC09_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include using namespace s

39、td;#include PCAP.H#include StatisticsList.h/ Added by ClassView/ CIPPackCapDlg dialogclass CIPPackCapDlg : public CDialogpublic:void ResetData();/在用户重新开始监控时 重新初始化数据void SaveToFile();/将最近一次统计结果保存到指定文件void AskSaveToFile();/询问用户是否保存文件void EnableSomeWindow(BOOL bEnable);/在监控过程中 使一些输入控件无效void UpdateOutput();/更新统计列表输出BOOL StartListenning();/

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号