监控IP包流量05062124(吴文强)_第1页
监控IP包流量05062124(吴文强)_第2页
监控IP包流量05062124(吴文强)_第3页
监控IP包流量05062124(吴文强)_第4页
监控IP包流量05062124(吴文强)_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南昌航空大学计算机学院课程设计说明书课程名称: 计算机网络课程设计 设计题目: 监控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) /以混杂模式打开网卡AfxMessageBox( 无法打开指定网卡! ); return 0; if(d-addresses!=NULL) netmask=(structsockaddr_in*)(d-addresses-netmask)-sin_addr.S_un.S_addr;/获得子网掩码 else netmask=0xffffff; if(pcap_compile(fp,&fcode,packet_filter,1,netmask)0) /编辑过滤器 AfxMessageBox(n无法编辑过器!n); return 0; if(pcap_setfilter(fp,&fcode)m_hWnd); int res; while(res=pcap_next_ex(fp,&header,&pkt_data)=0) /循环抓包 if(res=0) /如果没抓到包,则结束此次循环 continue; if(capstop=false)break; /接收到停止按钮发来的终止线程信号,终止线程 count+; /如果抓到包,计数器加1 CString s; s.Format(%dn,count); pall-GetDlgItem(IDC_CLOCK)-SetWindowText(s); /改变显示所抓到的包个数 ip_header *ih; /一个临时存储 ih=(ip_header *)(pkt_data+14); /找到IP头的位置 link.addNode(ih-saddr); /将源IP地址加入链表 return 1;(8)捕获按钮关键代码: void CIPStatisticDlg:OnButton1() d=alldevm_comboboxx.GetCurSel(); /找到用户选择的网卡GetDlgItem(IDC_STATE)-SetWindowText(正在捕获中.); /显示当前状态GetDlgItem(IDC_COMBO1)-EnableWindow(false); /网卡列表不可用 GetDlgItem(IDC_BUTTON1)-EnableWindow(false); /开始捕获按钮不可用 GetDlgItem(IDC_BUTTON3)-EnableWindow(true); /停止按钮变为可用m_listcontrol.DeleteAllItems(); capstop=true; /信号量赋值cap=AfxBeginThread(AFX_THREADPROC)Threadcap,NULL); /创建线程并立即执行 (9)停止按钮代码: void CIPStatisticDlg:OnButton3() GetDlgItem(IDC_STATE)-SetWindowText(已停止捕获!); /显示当前状态GetDlgItem(IDC_COMBO1)-EnableWindow(true); /网卡列表可用 GetDlgItem(IDC_BUTTON1)-EnableWindow(true); /开始捕获按钮可用 GetDlgItem(IDC_BUTTON3)-EnableWindow(false); /停止按钮不可用capstop=false; /发送信号,终止线程ofstream fout(login.txt,ios:app); /日志记录文件 foutt捕获IP包记录如下:endl; /往日志文件写东西 fout开始时间为:; time_t tmp=time(NULL); foutctime(&tmp); /写入当前系统时间作为捕获开始时间 fout Sour IP tpacket numberspNext)/输出结果到日志与列表 long lTemp=pTemp-getIPAddress(); long r=pTemp-getCount(); foutinet_ntoa(*(in_addr*)&(lTemp)t; foutgetCount()endl; int row=m_listcontrol.InsertItem(0,inet_ntoa(*(in_addr*)&(lTemp);/将存储的源地址输出到列表控制框中 sprintf(tmpstr,%ld,(long*)r); /将r转换为字符型 m_listcontrol.SetItemText(row,1,tmpstr); /将存储的源IP地址所对应的包个数输出到列表控制框中(10)退出按钮代码: void CIPStatisticDlg:OnButton2() /退出按钮 PostQuitMessage(0);(11)清空按钮代码:void CIPStatisticDlg:OnButton4() m_listcontrol.DeleteAllItems(); /清空列表控制框五系统调试与测试(一)程序的运行(1)由图3中的有网卡选择的初始化界面继而完善各个按钮功能以及抓包线程的定义后,程序可以运行,运行界面如下:图4捕获包中(2)再以上界面的基础上按下停止按钮后,进入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论