资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
南昌航空大学计算机学院课程设计说明书课程名称: 计算机网络课程设计 设计题目: 监控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 AppWizardexe工程,取名为IPStatistic。在IDD_IPSTATISTIC_DIALOG中加入界面所需要的控件,所加的控件从上到下依次有静态文本取名为网卡列表,下拉列表框(定义变量为m_comboboxx),静态文本取名为捕获包个数,静态文本(设置ID为IDC_CLOCK,用于显示捕获的包个数),开始捕获按钮,停止按钮,退出按钮,静态文本(设置ID为IDC_STATE,用于表示当前状态),一个组合框(取名为统计结果如下:), 一个清空列表按钮,最后一个是列表控制框(用于显示最后捕获的数据统计),此时的界面如下图: 图2 初始化界面 (2)向工程里添加C+头文件,命名为IPNodeList(存储结构接点和链表的定义),代码如下: /IP结点类,存放IP包的源IP地址和其它发送数据包个数class IPNodeprivate: 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 NodeListIPNode * 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添加wpdpackInclude目录;在Library files 中添加wpdpackLib目录(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; unsigned char proto; unsigned short crc; DWORD saddr; DWORD daddr; unsigned int op_pad; ;pcap_if_t *d; /当前所用网卡pcap_if_t *alldev5; /所有网卡存储数组pcap_t *fp; /网卡描述符char errbufPCAP_ERRBUF_SIZE; /错误信息存储unsigned int netmask; /子网掩码char packet_filter=ip; /过滤,选择IP协议struct bpf_program fcode; /将过滤规则转换为内核能够处理的字节码struct pcap_pkthdr *header; const unsigned char *pkt_data;NodeList link; /存储数据用链表bool capstop; /信号量:线程需要中止。CWinThread* cap; /定义线程int count=0; /计数器(6)窗口初始化时加入的一些关键代码如下: pcap_if_t *alldevs; /网卡链表的一个指针if(pcap_findalldevs(&alldevs,errbuf)=-1) MessageBox(找不到网卡!); /查找网卡int i;for(d=alldevs,i=0;d;d=d-next,i+)m_comboboxx.AddString(d-description); /下拉列表中显示网卡描述alldevi=d; /将网卡存入数组中 m_comboboxx.SetCurSel(0); /下拉列表中第一项显示0号网卡 m_listcontrol.InsertColumn(0,Source IP,LVCFMT_LEFT,170,-1); /列表控制框标题栏 m_listcontrol.InsertColumn(1,Packet numbers,LVCFMT_LEFT,155,-1); /列表控制框标题栏GetDlgItem(IDC_BUTTON3)-EnableWindow(false); /初始停止按钮不可用 此时已经找到主机上的网卡并加入到下拉列表中供用户选择,此时的界面如下: 图3初始化窗口(有网卡选择)(7)捕获包线程函数定义如下: UINT Threadcap()if (fp= pcap_open_live(d-name, 65536, 1,1000, errbuf) = NULL) /以混杂模式打开网卡AfxMes
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号