监控IP包流量
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
初 始 化 窗 口
抓 包 数 据 图
停止按钮(3)
int row =m_listcontrol.InsertItem(0,inet_ntoa(*(in_addr*)&(lT emp))); //将存储的源IP地址输出到列表控制框中 sprintf(tmpstr,"%ld",(long*)r); //将r转换为字符型 m_listcontrol.SetItemText(row,1,tmpstr);} //将存储的源IP地址所对应的包个数输出到列表控制框 中 }
while((res=pcap_next_ex(fp,&header,&pkt_data))>=0) //循环抓包 { if(res==0) //如果没抓到包,则结束此次循环 continue; count++; //如果抓到包,计数器加1 CString s; s.Format("%d\n",count); pall->GetDlgItem(IDC_CLOCK)->SetWindowText(s); // 改变显示所抓到的包个数 if(capstop==false){break;} //接收到停止按钮发来的终止线程信号,终止线程 ip_header *ih; ih=(ip_header *)(pkt_data+14); //找到IP头的位置 link.addNode(ih->saddr); //将源IP地址加入链表 } return 1; }
清空列表按钮
void CIPStatisticDlg::OnButton4() { m_listcontrol.DeleteAllItems(); ////////////////////抓包线程函数//////////////////////// UINT Threadcap() { if ((fp= pcap_open_live(d->name, 65536, 1,1000, errbuf)) == NULL) //以混杂模式打开网卡 { AfxMessageBox(" 无法打开指定网卡! "); return 0; }
课程设计题目 监控IP包流量
小组成员:徐梦 卢昊 吴文强 曾凯
开发环境与工具
操作系统:Windows XP 网络环境:局域网或者Internet 开发工具:Visual C++
程 序 流 程 图
程序中定义的全局变量
pcap_if_t *d; //当前所用网卡 pcap_if_t *alldev[5]; //所有网卡存储数组 pcap_t *fp; //网卡描述符 char errbuf[PCAP_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; //计数器
停止按钮(1)
void CIPStatisticDlg::OnButton3() { // TODO: Add your control notification handler code here 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); //日志记录文件 fout<<"\t捕获IP包记录如下:"<<endl; //往日志文件写东西 fout<<"开始时间为:";
//编
if(pcap_setfilter(fp,&fcode)<0) 器 {AfxMessageBox("\n设置过滤器失败!\n"); return 0; }
//设置过滤
CIPStatisticDlg* pall=(CIPStatisticDlg*)(CWnd::FromHandle(AfxGetMainWnd()>m_hWnd)); int res;
if(d->addresses!=NULL) netmask=((struct sockaddr_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; }
停止按钮(2)
time_t tmp=time(NULL); fout<<ctime(&tmp); //写入当前系统时间作为捕获开始 时间 fout<<" Sour IP "<<"\tpacket numbers"<<endl; char tmpstr[50]; //临时存储输出字符用的字符数组 for(IPNode* pTemp=link.GetpHead();pTemp;pTemp=pTemp>pNext) //输出结果到日志与列表 {long lTemp=pTemp->getIPAddress(); long r=pTemp->getCount(); fout<<inet_ntoa(*(in_addr*)&(lTemp))<<'\t'; fout<<pTemp->getCount()<<endl;
窗口初始化时加入以下代码
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); //下拉列表中显示网卡描 述 alldev[i]=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); //初始停止按钮不可 用
开始捕获按钮
void CIPStatisticDlg::OnButton1() { d=alldev[m_comboboxx.GetCurSel()]; //找到用户选择的网卡 GetDlgItem(IDC_STATE)->SetWindowText("正在捕获中..."); //显示当前状态 GetDlgItem(IDC_COMBO1)->EnableWindow(false); //网卡列表不可用 GetDlgItem(IDC_BUTTON1)->EnableWindow(false); //开始捕获按钮不可用 GetDlgItem(IDC_BUTTON3)->EnableWindow(true); //停止按钮变为可用 capstop=true; //信号量赋值 cap=AfxBeginThread((AFX_THREADPROC)Threadcap,NULL); //创建线 程并立即执行 }