欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    精品资料(2021-2022年收藏)计算机网络课程设计监控IP数据包流量.doc

    • 资源ID:79615397       资源大小:446KB        全文页数:34页
    • 资源格式: DOC        下载积分:9金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要9金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    精品资料(2021-2022年收藏)计算机网络课程设计监控IP数据包流量.doc

    四 川 理 工 学 院课 程 设 计 书 学院 计算机学院 专业 计算机科学与技术 班级 题目 监控IP数据包流量 教师 学生 课程设计小组成员及分工本小组成员: xxx yyy zzz分工:xxx 做本课程设计的目的,本课程设计的要求及本课程设计的一些内容yyy 做本课程设计的一些基础知识,本课程设计的分析,本课程设计的结果,本课程设计的总结 zzz 做本课程设计的代码,本课程设计的框架设计,本课程设计的结果验证,本课程设计的逻辑分析。目 录一、 课程设计目的和要求1 1.课程设计目的:1 2.课程设计要求:1二、 课程设计的内容1三、 课程设计核心知识3四、 课程设计框架5五、 课程设计详细分析7六、 实验源代码14七、 课程设计总结30一、 课程设计目的和要求1.课程设计目的: 随着internet技术的发展,基于IP协议的网络应用成为网络技术研究与软件开发的一个重要基础,因此学习网络层的基本概念,了解IP协议的基本内容,对于掌握TCP/IP协议的主要内容和学习网络课程是十分重要的。通过本次课程设计,有助于熟悉IP包格式和加深对IP协议的理解。2.课程设计要求:编制程序,监控网络,捕获一段时间内网络上的IP数据包,按IP数据包的源地址统计出在该时间段内发出的IP包的个数,将其写入日志文件中并用图形表示出来。 程序的具体要求如下:1.在图形窗口界面下,根据用户输入的捕获时间和选择的网卡输出该段时间内的IP数据包流量分析2.能够将捕获的信息写入日志文件1二、 课程设计的内容1.课程设计的内容: 1)使用Winpcap,Winpcap的主要功能在于独立于主机协议(如TCP/IP)发送和接受原始数据包;2)列出网卡列表,让用户选择可用的网卡;3)使用过滤器捕获IP包,别的包都过滤掉;4)捕获IP包并按包的源地址进行统计(用链表结构进行实现)。5)将统计结果输出到图形窗口界面或输出到日志文件程序流程如图8-1所示。2. 一些必要的基础知识1. 熟悉IP首部格式2. 使用Winpcap工具WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.WinPcap产生的目的,就是为Win32应用程序提供这种访问方式; WinPcap提供了以下功能a) 捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的b) 在数据包发送给某应用程序前,根据用户指定的规则过滤数据包c) 将原始数据包通过网络发送出去d) 收集并统计网络流量信息使用Winpcap工具主要需要三个步骤: 1).安装底层驱动:在Winpcap官网(www.winpcap.org)下载并安装Winpcap.exe即可2).导入库文件:下载wpdpack开发包,并在开发环境(VC)中导入Lib和Include 文件夹路径。VC导入步骤(工具->选项->目录,分别在Include 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_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)pcap_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参数定义捕获数据的最大字节数。promisc指定是否将网络接口置于混杂模式。to_ms参数指*定超时时间(毫秒)。ebuf参数则仅在pcap_open_live()函数出错返回NULL时用于传递错误消息。这些参数中最重要的就是promisc参数,通过它可以将网卡监听设置为混杂模式,混杂模式是指不管网卡接收到的数据包是不是发给自己的,都向应用程序上传。这样可以捕获一些广播信息。本程序将监听模式设为混杂模式。3.编译并设置过滤器在打开网卡并得到网卡描述符后,可以编译并设置过滤器。 编译过滤器:int pcap_compile(pcap_t* p,struct bpf_program*    fp,char* str,int  optimize, bpf_u_int32 netmask)编译一个数据包过滤器,将一个能被核心态(kernel-level)过滤器引擎解释的程序中的高层过滤表达式(filtering expression)进行转化。pcap_compile()被用来将字符串str编译进过滤器程序(fp),程序(fp)是一个指向bpf_program结构体并被pcap_compile()赋值的指针。optimize控制是否对目标代码(resulting code)的性能进行优化。Netmask表明IPv4掩码,它仅在检查过滤器程序中的IPv4广播地址的时候被使用。返回1表示发生了错误,此时,pcap_geterr()将被用来显示错误信息。 设置过滤器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直接由数据包捕获驱动所调用,它在底层抓取到包时,直接调用用户传入的处理函数本程序使用另一个函数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: 获取到离线记录文件的最后一个报文31四、 课程设计框架1. 核心流程图:本程序是VC下基于对话框的窗口程序。界面如下:图1主要设计流程如下1. 在OnInitialDialog中获取并显示网卡信息2. 在用户点击开始监听按钮时:a) 验证用户有效输入(验证用户是否输入有效的监控时间,是否选择合适的过滤器,以及是否已选择网卡)b) 以混杂模式打开网卡c) 根据用户在列表框中的选择编译并设置过滤器d) 开始抓取报文,将结果添加到统计链表。并随时检测是否超时。e) 抓取完成之后,将结果输出到列表控件界面f) 在用户关闭窗口或者开始再次监控时提示是否将结果输入日志文件(在用户再次选择监控时,需要清空已有数据)g) 用户关闭窗口时,提示保存日志并释放打开的所有适配器信息五、 课程设计详细分析一、 相关数据结构:1. IP首部结构体IP_HEADERtypedef struct ip_headerunsigned 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;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;/节点计数unsigned char m_proto;/协议类型;3. 统计信息链表类CstatisticsList 该类维护抓取到的数据包链表class CStatisticsList public:void Init();/初始化头尾指针为空CIPNode* GetHead();/得到头指针void AddNode(long ip, unsigned char proto);/添加一个结点 如/果该结点存在 则增加其计数 如果不存在创建并添加该节点CStatisticsList();/创建一个头尾指针均为空的链表virtual CStatisticsList();/释放自身维护的链表private: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->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;CStatisticsList:CStatisticsList()CIPNode* pTemp;/遍历链表 依次释放节点if (m_pHead)pTemp = 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);/在监控过程中 使输入控件无效void UpdateOutput();/更新统计列表输出BOOL StartListenning();/开始抓取数据包void InitStatisticsListCtrl();/初始化统计列表控件设置void SetTipsInfo(LPCTSTR pszformat, .);/格式化并显示提示消息BOOL SetListenFilter();/设置监控过滤器BOOL OpenSelDev();/打开用户选定的适配器BOOL FindAndShowAllDevs();/查找并显示所有的适配器private:BOOL m_bHadListend;/标志用户是否是第一次监控time_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(!FindAndShowAllDevs()EndDialog(IDOK);/初始化统计列表控件设置InitStatisticsListCtrl();/设置默认过滤器(CComboBox*)GetDlgItem(IDC_COMBO_FILTER)->SetCurSel(0);3. 用户选择开始: 在响应函数OnBtnStart()中void CIPPackCapDlg:OnBtnStart() /如果之前有监听记录 询问是否保存记录到日志文件/并且重置必要数据(统计链表)if (m_bHadListend)AskSaveToFile();ResetData();UpdateData(TRUE);/验证是否输入定时if(m_uListenTime = 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)->SetWindowText("监听正常结束");/更新输出以及界面UpdateOutput();OnBtnStart是程序的核心部分,其他模块函数都为其服务,当用户非第一次监控时,会调用AskSaveToFile函数,该函数判断用户是否在日志文件编辑框中输入文件名,如果是,则修正该文件名为.txt格式并弹出提示框提醒用户是否将上一次结果保存到日志文件图2.保存日志提示框如果用户选择是,则在AskSaveToFile中调用SaveToFile函数,将记录输出到指定日志文件/*询问是否保存日志文件 如果选择是 调用SaveToFile保存记录到文件*/void CIPPackCapDlg:AskSaveToFile()/如果日志文件一栏不为空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为生成的日志文件:图3.生成的日志文件如果用户选择再次监控,在保存日志文件后,还需要清空已收集的报文包记录和显示界面。这是通过ResetData()来完成的。该函数遍历并释放m_statisticsList所有节点,然后清空列表控件显示。实现参见附源代码之后便开始打开网卡,设置过滤器,然后开始一次新的监听,监听代码如下:/开始在该适配器上不断抓包 并将捕获信息填入到统计链表BOOL CIPPackCapDlg:StartListenning()/使开始按钮和其他输入框不再响应输入EnableSomeWindow(FALSE);/获取开始时间time_t begin_time;time_t now_time;: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);CString strLeftTime;strLeftTime.Format("%d秒", left_time);GetDlgItem(IDC_TIME_LEFT)->SetWindowText(strLeftTime);if (left_time <= 0)bNormalExit = TRUE;break;/超时 继续进行下一次抓包if(ret = 0)continue;/在接收到的数据中得到IP首部IP_HEADER* pheader;pheader = (IP_HEADER*)(ppkt_data+14);m_statisticsList.AddNode(pheader->srcaddr, pheader->proto);return bNormalExit;该函数通pcap_next_ex统计在一段时间内抓取到的报文到m_statisticsList。完成统计之后,通过UpdateOutput()函数更新列表控件m_statisticsCtrl来显示链表中的统计结果。UpdateOutput通过遍历统计链表中的结果,并获取其中的信息输出到表项。通过inet_ntoa将long型IP地址转换为点分十进制的字符串。通过一个switch-case分支来解析节点中的m_proto字段属于何种协议。图4为解析过程界面图5为过滤器为udp时的运行结果:4. 关闭窗口时的处理流程:当用户选择关闭窗口时,在对话框关闭响应函数OnClose中:1.首先检测变量m_bHadListend如果为TRUE。说明用户已经至少监控过一次,调用AskSaveToFile函数。该函数首先判断用户是否输入了日志文件,如果是,则修正文件格式为.txt 之后弹出消息框提示保存并负责调用SaveToFile保存。如果用户未输入日志文件名,则什么也不做。2.调用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_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();CIPNode* 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 new 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_proto;/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.h"class CStatisticsList public:void Init();/初始化头尾指针为空CIPNode* 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.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_pHead;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 (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;void 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 <fstream>using namespace std;#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 Start

    注意事项

    本文(精品资料(2021-2022年收藏)计算机网络课程设计监控IP数据包流量.doc)为本站会员(可****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开